1 // ----------------------------------------------------------------------------
2 // contest.cxx
3 //
4 // Copyright (C) 2006-2010
5 // Dave Freese, W1HKJ
6 // Copyright (C) 2008-2009
7 // Stelios Bounanos, M0GLD
8 //
9 // This file is part of fldigi.
10 //
11 // Fldigi is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // Fldigi is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with fldigi. If not, see <http://www.gnu.org/licenses/>.
23 // ----------------------------------------------------------------------------
24
25 #include <iostream>
26
27 #include <FL/Fl.H>
28
29 #include "fl_digi.h"
30 #include "confdialog.h"
31
32 #include "contest.h"
33 #include "icons.h"
34 #include "dxcc.h"
35 #include "strutil.h"
36
37 static std::string SECTIONS = "\
38 DX \
39 CT RI EMA VT ME WMA NH \
40 ENY NNY NLI SNJ NNJ WHY \
41 DE MDC EPA WPA \
42 AL GA KY NC NFL PR SC SFL TN VA \
43 VI WCF AR LA MS NM NTX OK STX WTX \
44 EB LAX ORG PAC SB SCV SDG SF SJV SV \
45 AK AZ EWA ID MT NV OR UT WWA WY \
46 MI OH WV \
47 IL IN WI \
48 CO IA KS MN MO ND NE SD \
49 AB BC GTA MAR MB NL NT ONE ONN ONS QC SK ";
50
51 static std::string STATES = "\
52 DX CT MA ME NH RI VT \
53 NY NJ \
54 DE PA MD DC \
55 AL FL GA KY NC SC TN VA \
56 AR LA MS NM OK TX \
57 CA HI \
58 AK AZ ID MT NV OR UT WA WY \
59 MI OH WV \
60 IL WI IN \
61 CO IA KS MN MO ND NE SD ";
62
63 static std::string PROVINCES = "\
64 AB BC LB MB NB NF NS NU NWT ON PEI QC SK YT ";
65
66 static std::string MEXICO = "\
67 XE1 XE2 XE3 XF1 XF4 ";
68
69 static std::string IT1_ = "AL AT BI CN GE IM NO SP SV TO VB VC ";
70 static std::string IX1_ = "AO ";
71 static std::string IT2_ = "BG BS CO CR LC LO MB MI MN PV SO VA ";
72 static std::string IT3_ = "BL PD RO TV VE VI VR ";
73 static std::string IN3_ = "BZ TN ";
74 static std::string IV3_ = "GO PN TS UD ";
75 static std::string IT4_ = "BO FC FE MO PC PR RA RE RN ";
76 static std::string IT5_ = "AR FI GR LI LU MS PI PO PT SI ";
77 static std::string IT6_ = "AN AP AQ CH FM MC PE PS PU TE ";
78 static std::string IT7_ = "BA BR BT FG LE MT TA ";
79 static std::string IT8_ = "AV BN CB CE CS CZ IS KR NA PZ RC SA VV ";
80 static std::string IT0_ = "FR LT PG RI RM TR VT ";
81 static std::string IT9_ = "AG CL CT EN ME PA RG SR TP ";
82 static std::string IS0_ = "CA NU OR SS SU ";
83
84 static const std::vector<dxcc*>* dxcc_list;
85 std::string country_match = "";
86
class_test(std::string s)87 bool class_test(std::string s)
88 {
89 if (s.length() < 2) return false;
90 static std::string clss = "ABCDEF";
91 if (clss.find(toupper(s[s.length()-1])) == std::string::npos)
92 return false;
93 for (size_t n = 0; n < s.length() - 1; n++)
94 if (s[n] < '0' || s[n] > '9') return false;
95 return true;
96 }
97
state_test(std::string s)98 bool state_test(std::string s)
99 {
100 if (s.empty()) return false;
101 while (s.length() < 4) s.append(" ");
102 bool isState = (STATES.find(ucasestr(s)) != std::string::npos);
103 return isState;
104 }
105
county_test(std::string st,std::string cty)106 bool county_test(std::string st, std::string cty)
107 {
108 if (st.empty() && !progdefaults.SQSOinstate)
109 st = QSOparties.qso_parties[progdefaults.SQSOcontest].state;
110 if (!state_test(st))
111 return false;
112 return states.valid_county( st, cty );
113 }
114
province_test(std::string s)115 bool province_test(std::string s)
116 {
117 while (s.length() < 4) s.append(" ");
118 return (PROVINCES.find(ucasestr(s)) != std::string::npos);
119 }
120
district_test(std::string pr,std::string dist)121 bool district_test(std::string pr, std::string dist)
122 {
123 if (pr.empty() && !progdefaults.SQSOinstate)
124 pr = QSOparties.qso_parties[progdefaults.SQSOcontest].state;
125 if (!province_test(pr))
126 return false;
127 return states.valid_county( pr, dist );
128 }
129
check_test(std::string s)130 bool check_test(std::string s)
131 {
132 if (s.length() < 4) {
133 while (s.length() < 4) s.append(" ");
134 std::string CHECK = std::string(STATES).append(PROVINCES).append(MEXICO);
135 return (CHECK.find(s) != std::string::npos);
136 } else
137 return false;
138 }
139
country_test(std::string s)140 bool country_test(std::string s)
141 {
142 std::string str = ucasestr(s);
143 dxcc_list = dxcc_entity_list();
144 if (!dxcc_list) return true;
145 for (std::vector<dxcc*>::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) {
146 if (ucasestr((*i)->country).find(str) != std::string::npos) {
147 country_match = (*i)->country;
148 return true;
149 }
150 }
151 country_match.clear();
152 return false;
153 }
154
wfd_class_test(std::string s)155 bool wfd_class_test(std::string s)
156 {
157 if (s.length() < 2) return false;
158 static std::string clss = "IOH";
159 if (clss.find(toupper(s[s.length()-1])) == std::string::npos)
160 return false;
161 for (size_t n = 0; n < s.length() - 1; n++)
162 if (s[n] < '0' || s[n] > '9') return false;
163 return true;
164 }
165
ascr_class_test(std::string s)166 bool ascr_class_test(std::string s)
167 {
168 if (s.length() != 1) return false;
169 if (toupper(s[0]) == 'I' ||
170 toupper(s[0]) == 'C' ||
171 toupper(s[0]) == 'S') return true;
172 return false;
173 }
174
section_test(std::string s)175 bool section_test(std::string s)
176 {
177 while (s.length() < 4) s.append(" ");
178 return (SECTIONS.find(s) != std::string::npos);
179 }
180
rookie_test(std::string s)181 bool rookie_test(std::string s)
182 {
183 int year_licensed = 0;
184 if (!sscanf(s.c_str(), "%d", &year_licensed))
185 return false;
186 if (year_licensed < 100) year_licensed += 2000;
187 int year_worked = 0;
188 std::string s_year = std::string(zdate()).substr(0,4);
189 sscanf(s_year.c_str(), "%d", &year_worked);
190 if (year_worked < year_licensed) year_licensed -= 100;
191 if (year_worked - year_licensed < 3) return true;
192 return false;
193 }
194
c1010_test(std::string s)195 bool c1010_test(std::string s)
196 {
197 for (size_t n = 0; n < s.length(); n++)
198 if (s[n] < '0' || s[n] > '9') return false;
199 return true;
200 }
201
202 static std::string nbrs0 = "1234567890";
203 static std::string nbrs1 = "12345";
204 static std::string nbrs2 = "123456789Nn";
205 static std::string nbrs3 = "1234567890NnTt";
206
cut_to_numeric(std::string s)207 std::string cut_to_numeric(std::string s)
208 {
209 for (size_t n = 0; n < s.length(); n++) {
210 if (s[n] == 'N' || s[n] == 'n' ) s[n] = '9';
211 if (s[n] == 'T' || s[n] == 't' ) s[n] = '0';
212 }
213 return s;
214 }
215
cut_numeric_test(std::string s)216 bool cut_numeric_test(std::string s)
217 {
218 if (s.empty()) return false;
219 for (size_t n = 0; n < s.length(); n++)
220 if (nbrs3.find(s[n]) == std::string::npos) return false;
221 return true;
222 }
223
numeric_test(std::string s)224 bool numeric_test(std::string s)
225 {
226 if (s.empty()) return false;
227 for (size_t n = 0; n < s.length(); n++)
228 if (nbrs0.find(s[n]) == std::string::npos) return false;
229 return true;
230 }
231
rst_test(std::string s)232 bool rst_test(std::string s)
233 {
234 if (s.length() < 3 && active_modem->get_mode() < MODE_SSB)
235 return false;
236 if (s.length() < 2 || s.length() > 3) return false;
237 if (s[0] == '0') return false;
238 if (s.length() == 2) {
239 if (nbrs1.find(s[0]) == std::string::npos) return false;
240 if (nbrs2.find(s[1]) == std::string::npos) return false;
241 } else {
242 if (nbrs1.find(s[0]) == std::string::npos) return false;
243 if (nbrs2.find(s[1]) == std::string::npos) return false;
244 if (nbrs2.find(s[2]) == std::string::npos) return false;
245 }
246 return true;
247 }
248
italian_test(std::string s)249 bool italian_test(std::string s)
250 {
251 if (s.length() != 2) return false;
252 s.append(" ");
253 if (IT1_.find(s) != std::string::npos ||
254 IX1_.find(s) != std::string::npos ||
255 IT2_.find(s) != std::string::npos ||
256 IT3_.find(s) != std::string::npos ||
257 IN3_.find(s) != std::string::npos ||
258 IV3_.find(s) != std::string::npos ||
259 IT4_.find(s) != std::string::npos ||
260 IT5_.find(s) != std::string::npos ||
261 IT6_.find(s) != std::string::npos ||
262 IT7_.find(s) != std::string::npos ||
263 IT8_.find(s) != std::string::npos ||
264 IT0_.find(s) != std::string::npos ||
265 IT9_.find(s) != std::string::npos ||
266 IS0_.find(s) != std::string::npos )
267 return true;
268 return false;
269 }
270
ss_chk_test(std::string s)271 bool ss_chk_test(std::string s)
272 {
273 std::string nums = "0123456789";
274 if (nums.find(s[0]) != std::string::npos &&
275 nums.find(s[0]) != std::string::npos)
276 return true;
277 return false;
278 }
279
ss_prec_test(std::string s)280 bool ss_prec_test(std::string s)
281 {
282 std::string prec = "QABUMS";
283 if (prec.find(ucasestr(s)[0]) != std::string::npos)
284 return true;
285 return false;
286 }
287
check_field(std::string s,CONTEST_FIELD field,std::string s2)288 int check_field(std::string s, CONTEST_FIELD field, std::string s2)
289 {
290 switch (field) {
291 case cSTATE:
292 return state_test(s);
293 break;
294 case cVE_PROV:
295 return province_test(s);
296 break;
297 case cCHECK:
298 return check_test(s);
299 break;
300 case cCOUNTRY:
301 return country_test(s);
302 break;
303 case cCLASS:
304 case cFD_CLASS:
305 return class_test(s);
306 break;
307 case cWFD_CLASS:
308 return wfd_class_test(s);
309 break;
310 case cASCR_CLASS:
311 return ascr_class_test(s);
312 break;
313 case cARRL_SECT:
314 case cFD_SECTION:
315 return section_test(s);
316 break;
317 case cROOKIE:
318 return rookie_test(s);
319 break;
320 case c1010:
321 return c1010_test(s);
322 break;
323 case cRST:
324 return rst_test(s);
325 break;
326 case cSRX:
327 case cNUMERIC:
328 return numeric_test(s);
329 break;
330 case cITALIAN:
331 return italian_test(s);
332 break;
333 case cCNTY:
334 return county_test(s2, s);
335 break;
336 case cDIST:
337 return district_test(s2, s);
338 break;
339 case cSS_CHK:
340 return ss_chk_test(s);
341 break;
342 case cSS_PREC:
343 return ss_prec_test(s);
344 break;
345 case cSS_SERNO:
346 return numeric_test(s);
347 break;
348 case cSS_SEC:
349 return section_test(s);
350 break;
351 case cNAME: break;
352 case cQTH: break;
353 case cGRIDSQUARE: break;
354 case cXCHG1: break;
355 case cKD_XCHG: break;
356 case cARR_XCHG: break;
357 case cCQZ: break;
358 default: break;
359 }
360 return true;
361 }
362
363 CONTESTS contests[] = {
364 { "No Contest", "CALL if (RSTr), if (LOCATOR), NAME, QTH" },
365 { "Generic contest", "CALL EXCHANGE" },
366 { "Africa All-Mode International", "CALL SERNO, COUNTRY, RSTr, RSTs" },
367 { "ARRL Field Day", "CALL SECTION, CLASS, RSTr, RSTs" },
368 { "ARRL International DX (cw)", "CALL COUNTRY, POWER, RSTr, RSTs" },
369 { "ARRL Jamboree on the Air", "CALL TROOP_NO, STATE / VE_PROV / COUNTRY, RSTr, RSTs, SCOUT_NAME" },
370 { "ARRL Kids Day", "CALL, NAME, AGE, QTH, COMMENT, RSTr, RSTs" },
371 { "ARRL Rookie Roundup", "CALL, NAME, CHECK, STATE / VE_PROV, RSTr, RSTs" },
372 { "ARRL RTTY Roundup", "CALL STATE, SERNO, COUNTRY, RSTr, RSTs" },
373 { "ARRL School Club Roundup", "CALL CLASS, STATE / VE_PROV, NAME, RSTr, RSTs" },
374 { "ARRL November Sweepstakes", "CALL SECTION, SERNO, PREC, CHECK, RSTr, RSTs" },
375 { "ARRL Winter FD", "CALL SECTION, CLASS, RSTr, RSTs" },
376 { "BARTG RTTY contest", "CALL NAME, SERIAL, EXCHANGE" },
377 { "CQ WPX", "CALL SERNO, COUNTRY, RSTr, RSTs" },
378 { "CQ WW DX", "CALL COUNTRY, ZONE, RSTr, RSTs" },
379 { "CQ WW DX RTTY", "CALL STATE, COUNTRY, ZONE, RSTr" },
380 { "Italian A.R.I. International DX", "CALL PR(ovince), COUNTRY, SERNO, RSTr, RSTs" },
381 { "NAQP", "CALL NAME, STATE / VE_PROV / COUNTRY" },
382 { "NA Sprint", "CALL SERNO, STATE / VE_PROV / COUNTRY, NAME, RSTr, RSTs" },
383 { "Ten Ten", "CALL 1010NR, STATE, NAME, RSTr, RSTs" },
384 { "VHF", "CALL RSTr, RSTs" },
385 //{ "Worked All Europe", "CALL SERNO, COUNTRY, RSTr, RSTs" },
386 { "State QSO parties", "" },
387 { "", "" }
388 };
389
390 struct QSOP Ccontests::qso_parties[] = {
391 /*
392 {"QSO Party Contest", "ST", "in", "rRST","rST","rCY","rSER","rXCHG","rNAM","rCAT", "STCTY", "Notes"},
393 */
394 {"None selected", "", "", "", "", "", "", "", "", "", "", "CALL if (RSTr), if (LOCATOR), NAME, QTH" },
395 {"Alabama QSO Party", "AL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
396 {"ALQP (Out of State)", "AL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
397 {"Arizona QSO Party", "AZ", "T", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
398 {"AZQP (Out of State)", "AZ", "", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY"},
399 {"Arkansas QSO Party", "AR", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
400 {"ARQP (Out of State)", "AR", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
401 {"British Columbia QSO Party", "BC", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
402 {"BCQP (Out of Province)", "BC", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"},
403 {"California QSO Party", "CA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"},
404 {"CAQP (Out of State)", "CA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"},
405 {"Colorado QSO Party", "CO", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"},
406 {"COQP (Out of State)", "CO", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"},
407 {"Delaware QSO Party", "DE", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
408 {"DEQP (Out of State)", "DE", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"},
409 {"Florida QSO Party", "FL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
410 {"FLQP (Out of State)", "FL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
411 {"Georgia QSO Party", "GA", "T", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
412 {"GAQP (Out of State)", "GA", "", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY"},
413 {"Hawaii QSO Party", "HI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
414 {"HIQP (Out of State)", "HI", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
415 {"Idaho QSO Party", "ID", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
416 {"IDQP (Out of State)", "ID", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
417 {"Illinois QSO Party", "IL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
418 {"ILQP (Out of State)", "IL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
419 {"Indiana QSO Party", "IN", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
420 {"INQP (Out of State)", "IN", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
421 {"Iowa QSO Party", "IA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
422 {"IAQP (Out of State)", "IA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
423 {"Kansas QSO Party", "KS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
424 {"KSQP (Out of State)", "KS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
425 {"Kentucky QSO Party", "KY", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
426 {"KYQP (Out of State)", "KY", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
427 {"Louisiana QSO Party", "LA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
428 {"LAQP (Out of State)", "LA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
429 {"Maine QSO Party", "ME", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
430 {"MEQP (Out of State)", "ME", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
431 {"Maryland QSO Party", "MD", "T", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY ST/PR/CNTRY"},
432 {"MDQP (Out of State)", "MD", "", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY"},
433 {"Michigan QSO Party", "MI", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"},
434 {"MIQP (Out of State)", "MI", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"},
435 {"Minnesota QSO Party", "MN", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"},
436 {"MNQP (Out of State)", "MN", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"},
437 {"Missouri QSO Party", "MO", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
438 {"MOQP (Out of State)", "MO", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
439 {"Mississippi QSO Party", "MS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
440 {"MSQP (Out of State)", "MS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
441 {"Montana QSO Party", "MT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
442 {"MTQP (Out of State)", "MT", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
443 {"North Carolina QSO Party", "NC", "T", "B", "B", "B", "", "I", "", "", "", "CALL CNTY ST/PR/CNTRY"},
444 {"NCQP (Out of State)", "NC", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"},
445 {"Nebraska QSO Party", "NE", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
446 {"NEQP (Out of State)", "NE", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
447 {"New Jersey QSO Party", "NJ", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
448 {"NJQP (Out of State)", "NJ", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
449 {"New Mexico QSO Party", "NM", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"},
450 {"NMQP (Out of State)", "NM", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"},
451 {"New York QSO Party", "NY", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
452 {"NYQP (Out of State)", "NY", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
453 {"North Dakota QSO Party", "ND", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
454 {"NDQP (Out of State)", "ND", " ", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"},
455 {"Ohio QSO Party", "OH", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
456 {"OHQP (Out of State)", "OH", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
457 {"Oklahoma QSO Party", "OK", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
458 {"OKQP (Out of State)", "OK", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
459 {"Ontario QSO Party", "ON", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
460 {"ONQP (Out of Province)", "ON", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"},
461 {"Pennsylvania QSO Party", "PA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"},
462 {"PAQP (Out of State)", "PA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"},
463 {"South Carolina QSO Party" , "SC", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
464 {"SCQP (Out of State)", "SC", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"},
465 {"South Dakota QSO Party", "SD", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
466 {"SDQP (Out of State)", "SD", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"},
467 {"Tennessee QSO Party", "TN", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
468 {"TNQP (Out of State)", "TN", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"},
469 {"Texas QSO Party", "TX", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
470 {"TXQP (Out of State)", "TX", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"},
471 {"Vermont QSO Party", "VT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
472 {"VTQP (Out of State)", "VT", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"},
473 {"Virginia QSO Party", "VA", "T", "", "B", "B", "B", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
474 {"VAQP (Out of State)", "VA", "", "", "B", "B", "B", "I", "", "", "", "CALL CNTY"},
475 {"Washington Salmon Run QSO Party","WA", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
476 {"WAQP (Out of State)", "WA", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"},
477 {"Wisconsin QSO Party", "WI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
478 {"WIQP (Out of State)", "WI", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"},
479 {"West Virginia QSO Party", "WV", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"},
480 {"WVQP (Out of State)", "WV", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"},
481 {"7QP QSO Party", "7QP","T", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY) or (DX)]"},
482 {"7QP (Out of Region)", "7QP","", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY)]"},
483 {"New England QSO Party", "6NE","T", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST) or (DX)]"},
484 {"NEQP (Out of Region)", "6NE","", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST)]"},
485 {"", "", "", "", "", "", "", "", "", "", "", ""}
486 };
487 //{"Alaska QSO Party", "AK", "T", "", "", "", "", "", "", "", "", ""},
488 //{"Connecticut QSO Party", "CT", "T", "", "", "", "", "", "", "", "", ""},
489 //{"Massachusetts QSO Party", "MA", "T", "", "", "", "", "", "", "", "", ""},
490 //{"New Hampshire QSO Party", "NH", "T", "", "", "", "", "", "", "", "", ""},
491 //{"Nevada QSO Party", "NV", "T", "", "", "", "", "", "", "", "", ""},
492 //{"Oregon QSO Party", "OR", "T", "", "", "", "", "", "", "", "", ""},
493 //{"Rhode Island QSO Party", "RI", "T", "", "", "", "", "", "", "", "", ""},
494 //{"Utah QSO Party", "UT", "T", "", "", "", "", "", "", "", "", ""},
495 //{"Wyoming QSO Party", "WY", "T", "", "", "", "", "", "", "", "", ""},
496
contest_names()497 std::string contest_names()
498 {
499 std::string _names;
500 for (size_t n = 0; n < sizeof(contests) / sizeof(*contests) - 1; n++)
501 _names.append(contests[n].name).append("|");
502 return _names;
503 }
504
505 Ccontests QSOparties;
506
names()507 const std::string Ccontests::names()
508 {
509 std::string _names;
510 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties) - 1; n++ )
511 _names.append(qso_parties[n].contest).append("|");
512 return _names;
513 }
514
notes(std::string party)515 const char *Ccontests::notes(std::string party)
516 {
517 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
518 if (party == qso_parties[n].contest)
519 return qso_parties[n].notes;
520 return "";
521 }
522
523
rst(std::string party)524 char Ccontests::rst(std::string party)
525 {
526 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
527 if (party == qso_parties[n].contest)
528 return qso_parties[n].rst[0];
529 return ' ';
530 }
531
st(std::string party)532 char Ccontests::st(std::string party)
533 {
534 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
535 if (party == qso_parties[n].contest)
536 return qso_parties[n].st[0];
537 return ' ';
538 }
539
cnty(std::string party)540 char Ccontests::cnty(std::string party)
541 {
542 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
543 if (party == qso_parties[n].contest)
544 return qso_parties[n].cnty[0];
545 return ' ';
546 }
547
serno(std::string party)548 char Ccontests::serno(std::string party)
549 {
550 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
551 if (party == qso_parties[n].contest)
552 return qso_parties[n].serno[0];
553 return ' ';
554 }
555
556
xchg(std::string party)557 char Ccontests::xchg(std::string party)
558 {
559 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
560 if (party == qso_parties[n].contest)
561 return qso_parties[n].xchg[0];
562 return ' ';
563 }
564
name(std::string party)565 char Ccontests::name(std::string party)
566 {
567 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
568 if (party == qso_parties[n].contest)
569 return qso_parties[n].name[0];
570 return ' ';
571 }
572
cat(std::string party)573 char Ccontests::cat(std::string party)
574 {
575 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
576 if (party == qso_parties[n].contest)
577 return qso_parties[n].cat[0];
578 return ' ';
579 }
580
stcty(std::string party)581 char Ccontests::stcty(std::string party)
582 {
583 for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
584 if (party == qso_parties[n].contest)
585 return qso_parties[n].stcty[0];
586 return ' ';
587 }
588
adjust_for_contest(void *)589 void adjust_for_contest(void *)
590 {
591 int n = progdefaults.SQSOcontest;
592
593 progdefaults.SQSOinstate = false;
594 progdefaults.SQSOlogcounty = false;
595 progdefaults.SQSOlogstate = false;
596 progdefaults.SQSOlogxchg = false;
597 progdefaults.SQSOlogrst = false;
598 progdefaults.SQSOlogname = false;
599 progdefaults.SQSOlogserno = false;
600 progdefaults.SQSOlogstcty = false;
601 progdefaults.SQSOlogctyst = false;
602 progdefaults.SQSOlogcat = false;
603
604 if (QSOparties.qso_parties[n].instate[0] == 'T')
605 progdefaults.SQSOinstate = true;
606
607 if (progdefaults.SQSOinstate) {
608 if (QSOparties.qso_parties[n].st[0] == 'I' || QSOparties.qso_parties[n].st[0] == 'B')
609 progdefaults.SQSOlogstate = true;
610 if (QSOparties.qso_parties[n].cnty[0] == 'I' || QSOparties.qso_parties[n].cnty[0] == 'B')
611 progdefaults.SQSOlogcounty = true;
612 if (QSOparties.qso_parties[n].xchg[0] == 'I' || QSOparties.qso_parties[n].xchg[0] == 'B')
613 progdefaults.SQSOlogxchg = true;
614 if (QSOparties.qso_parties[n].rst[0] == 'I' || QSOparties.qso_parties[n].rst[0] == 'B')
615 progdefaults.SQSOlogrst = true;
616 if (QSOparties.qso_parties[n].name[0] == 'I' || QSOparties.qso_parties[n].name[0] == 'B')
617 progdefaults.SQSOlogname = true;
618 if (QSOparties.qso_parties[n].serno[0] == 'I' || QSOparties.qso_parties[n].serno[0] == 'B')
619 progdefaults.SQSOlogserno = true;
620 if (QSOparties.qso_parties[n].cat[0] == 'I' || QSOparties.qso_parties[n].cat[0] == 'B')
621 progdefaults.SQSOlogcat = true;
622 } else {
623 if (QSOparties.qso_parties[n].st[0] == 'O' || QSOparties.qso_parties[n].st[0] == 'B')
624 progdefaults.SQSOlogstate = true;
625 if (QSOparties.qso_parties[n].cnty[0] == 'O' || QSOparties.qso_parties[n].cnty[0] == 'B')
626 progdefaults.SQSOlogcounty = true;
627 if (QSOparties.qso_parties[n].xchg[0] == 'O' || QSOparties.qso_parties[n].xchg[0] == 'B')
628 progdefaults.SQSOlogxchg = true;
629 if (QSOparties.qso_parties[n].rst[0] == 'O' || QSOparties.qso_parties[n].rst[0] == 'B')
630 progdefaults.SQSOlogrst = true;
631 if (QSOparties.qso_parties[n].name[0] == 'O' || QSOparties.qso_parties[n].name[0] == 'B')
632 progdefaults.SQSOlogname = true;
633 if (QSOparties.qso_parties[n].serno[0] == 'O' || QSOparties.qso_parties[n].serno[0] == 'B')
634 progdefaults.SQSOlogserno = true;
635 if (QSOparties.qso_parties[n].cat[0] == 'O' || QSOparties.qso_parties[n].cat[0] == 'B')
636 progdefaults.SQSOlogcat = true;
637 }
638 if (QSOparties.qso_parties[n].stcty[0] == 'S')
639 progdefaults.SQSOlogstcty = true;
640 if (QSOparties.qso_parties[n].stcty[0] == 'C')
641 progdefaults.SQSOlogctyst = true;
642
643 update_main_title();
644
645 //std::cout << "QSOparties.qso_parties[" << n << "]\n"
646 // << QSOparties.qso_parties[n].contest << std::endl
647 // << "instate: " << progdefaults.SQSOinstate << std::endl
648 // << "ST: " << QSOparties.qso_parties[n].state << std::endl
649 // << "rRST: " << QSOparties.qso_parties[n].rst << std::endl
650 // << "rST: " << QSOparties.qso_parties[n].st << std::endl
651 // << "rCY: " << QSOparties.qso_parties[n].cnty << std::endl
652 // << "rSER: " << QSOparties.qso_parties[n].serno << std::endl
653 // << "rXCHG: " << QSOparties.qso_parties[n].xchg << std::endl
654 // << "rNAM: " << QSOparties.qso_parties[n].name << std::endl
655 // << "rCAT: " << QSOparties.qso_parties[n].cat << std::endl
656 // << "STCTY: " << QSOparties.qso_parties[n].stcty << std::endl
657 // << "Notes: " << QSOparties.qso_parties[n].notes << std::endl;
658
659 }
660
661