00001
00008
00009
00010
00011
00012
00013
00014 #include <PalmOS.h>
00015 #include <PalmCompatibility.h>
00016 #include "gtalkRsc.h"
00017 #include "MathLib.h"
00018 #include "gpslib.h"
00019 #include "gtalk.h"
00020 #include "gpsutil.h"
00021 #include "dbio.h"
00022 #include "gpsio.h"
00023 #include "memo.h"
00024 #include "log.h"
00025
00026 GpsOperation GpsOp;
00027 static char StatHost[32];
00028 static char CategoryName[dmCategoryLength];
00029 static UInt ItemsToSendInCategory (DmOpenRef DB) IO_SECTION;
00030 static Boolean OkForGremlins (unsigned int prob) IO_SECTION;
00031
00032
00040 Boolean
00041 HostFormHandleEvent (EventPtr e)
00042 {
00043 Boolean handled = false;
00044 FormPtr frm;
00045 static char WptCategoryName[dmCategoryLength],
00046 TrkCategoryName[dmCategoryLength],
00047 RteCategoryName[dmCategoryLength];
00048
00049 switch (e->eType)
00050 {
00051 case frmOpenEvent:
00052 frm = FrmGetActiveForm ();
00053 CategoryGetName (WptDB, Prefs.wptcategory, WptCategoryName);
00054 CategorySetTriggerLabel (GetObjPtr (HostWptPopupID), WptCategoryName);
00055 CategoryGetName (TrkDB, Prefs.trkcategory, TrkCategoryName);
00056 CategorySetTriggerLabel (GetObjPtr (HostTrkPopupID), TrkCategoryName);
00057 CategoryGetName (RteDB, Prefs.rtecategory, RteCategoryName);
00058 CategorySetTriggerLabel (GetObjPtr (HostRtePopupID), RteCategoryName);
00059 FrmDrawForm (frm);
00060 handled = true;
00061 break;
00062
00063 case frmCloseEvent:
00064 break;
00065
00066
00067 case ctlSelectEvent:
00068 frm = FrmGetActiveForm ();
00069 switch (e->data.ctlSelect.controlID)
00070 {
00071 case HostWptPopupID:
00072 CategorySelect (WptDB, frm, HostWptPopupID, HostWptListID, true,
00073 (WordPtr) & Prefs.wptcategory, WptCategoryName, 1, 0);
00074 break;
00075 case HostRtePopupID:
00076 CategorySelect (RteDB, frm, HostRtePopupID, HostRteListID, true,
00077 (WordPtr) & Prefs.rtecategory, RteCategoryName, 1, 0);
00078 break;
00079 case HostTrkPopupID:
00080 CategorySelect (TrkDB, frm, HostTrkPopupID, HostTrkListID, true,
00081 (WordPtr) & Prefs.trkcategory, TrkCategoryName, 1, 0);
00082 break;
00083 case BtCancelID:
00084 FrmReturnToForm (0);
00085 break;
00086 case BtGoID:
00087 CompactTracks = GetControlValue (HostCmptID);
00088
00089 GpsOp = gpsHostMode;
00090 FrmGotoForm (ProgressForm);
00091 break;
00092 }
00093 handled = true;
00094 break;
00095
00096 default:
00097 break;
00098 }
00099
00100 return handled;
00101 }
00102
00103
00111 Boolean
00112 ProgressFormHandleEvent (EventPtr e)
00113 {
00114 Boolean handled = false;
00115
00116 static FieldPtr fdPtr;
00117 ULong GPSTime;
00118 static ULong start,
00119 t;
00120 Long TimeDiff;
00121 char buf[16];
00122 static char *p,
00123 *statp;
00124 EventType evt;
00125 Radian_Type *PositionP;
00126 static FieldPtr StatHostFdPtr;
00127 static Boolean IgnoreEooEvt;
00128 Err error=0;
00129
00130 if (e->eType!=nilEvent) debug_in (GTALKDBG_CALLS, ("->ProgressFormHandleEvent(%s)",
00131 e->eType > LASTVALIDEVTNAME ?StrIToA(buf,e->eType):EvtNames[e->eType]));
00132 switch (e->eType)
00133 {
00134 case nilEvent:
00135 GpslibTicks () ;
00136 if (statp && (TimGetTicks () > t + sysTicksPerSecond / 3))
00137 {
00138
00139 StrNCopy (buf, p >= (statp + StrLen (statp)) ? p = statp : p, sizeof (buf));
00140 p++;
00141 StrNCat (buf, statp, sizeof (buf));
00142
00143 FldSetTextPtr (StatHostFdPtr, buf);
00144 FldRecalculateField (StatHostFdPtr, true);
00145 FldDrawField (StatHostFdPtr);
00146 t = TimGetTicks ();
00147 }
00148 handled = true;
00149 break;
00150
00151 case frmOpenEvent:
00152
00153 StatHostFdPtr = (FieldPtr) (GetObjPtr (FdStatus2ID));
00154 p = statp = NULL;
00155 t = TimGetTicks ();
00156 New = Replaced = Sent = 0;
00157 fdPtr = (FieldPtr) (GetObjPtr (FdStatusID));
00158 FrmDrawForm (FrmGetActiveForm ());
00159 #ifdef LOOSE
00160 if (Prefs.looseprotocol) GpslibControl(GpslibCtrl_LooseProto,&Prefs.looseprotocol);
00161 #endif
00162 switch (GpsOp)
00163 {
00164 case gpsHostMode:
00165 case gpsEnableAsyncEvts:
00166 SysCopyStringResource (StatHost, StrHostRunning);
00167 statp = p = StatHost;
00168 error=GarminSetHostMode (fdPtr, Prefs.emulatedgps);
00169 if (!error) if (GpsOp == gpsHostMode)
00170 {
00171 GarminGetWpts (put_wpt, fdPtr);
00172 GarminGetTrks (put_trk, fdPtr);
00173 GarminGetRtes (put_rte, fdPtr);
00174 }
00175 #ifdef EVENTS
00176 else
00177 error=GarminEnableAsyncEvents (&put_packet, fdPtr, 0x7201);
00178 #endif
00179 break;
00180
00181 case gpsUpload:
00182 #ifdef FURUNO
00183 if (Furuno) {
00184 if (Prefs.todisplay == DispWpt)
00185 error=FurunoPutWpts (&Furuno_get_next_wpt, fdPtr,
00186 DmNumRecordsInCategory (WptDB, Prefs.wptcategory));
00187 else if (Prefs.todisplay == DispRte)
00188 error=FurunoPutRtes (&get_next_full_rte, fdPtr,
00189 DmNumRecordsInCategory (RteDB, Prefs.rtecategory));
00190 } else
00191 #endif
00192 if (Prefs.todisplay == DispWpt)
00193 error=GarminPutWpts (&get_next_wpt, fdPtr,ItemsToSendInCategory(WptDB));
00194 else if (Prefs.todisplay == DispTrk)
00195 error=GarminPutTrks (&get_next_trk, fdPtr, ItemsToSendInCategory (TrkDB));
00196 else if (Prefs.todisplay == DispRte)
00197 error=GarminPutRtes (&get_next_rte, fdPtr, ItemsToSendInCategory (RteDB));
00198 break;
00199
00200 case gpsDownload:
00201 if (Prefs.todisplay == DispWpt)
00202 error=GarminGetWpts (put_wpt, fdPtr);
00203 else if (Prefs.todisplay == DispTrk)
00204 error=GarminGetTrks (put_trk, fdPtr);
00205 else if (Prefs.todisplay == DispRte)
00206 error=GarminGetRtes (put_rte, fdPtr);
00207 break;
00208
00209 case gpsGetTime:
00210 error=GarminGetTime (fdPtr);
00211 Prefs.todisplay -= 4;
00212 break;
00213
00214 case gpsGetPosition:
00215 error=GarminGetPosition (fdPtr);
00216 Prefs.todisplay -= 8;
00217 break;
00218
00219 case gpsGetInfos:
00220 debug (GTALKDBG_INFOS, ("ProgressFormHandleEvent: before GarminGetRemoteInfos"));
00221 error=GarminGetRemoteInfos (fdPtr);
00222 debug (GTALKDBG_INFOS, ("ProgressFormHandleEvent: after GarminGetRemoteInfos"));
00223 Prefs.todisplay -= 32;
00224 default:
00225 }
00226 if (error) {
00227 HideObject(BtStopID);
00228 ShowObject(BtOKID);
00229 }
00230 else {
00231 start = TimGetSeconds ();
00232 MustCallGpslibTicks = 1;
00233 IgnoreEooEvt = 0;
00234 }
00235 handled = true;
00236 break;
00237
00238 case frmCloseEvent:
00239 GPSEndOfOperation ();
00240 MustCallGpslibTicks = 0;
00241 CleanUpTracks ();
00242
00243
00244 break;
00245
00246 case ctlSelectEvent:
00247 switch (e->data.ctlSelect.controlID)
00248 {
00249 case BtStopID:
00250 if (OkForGremlins(20))GPSEndOfOperation ();
00251 handled = true;
00252 break;
00253 case BtOKID:
00254 FrmReturnToForm (0);
00255 handled = true;
00256 break;
00257 }
00258 break;
00259
00260 case TransferWptReqEvent:
00261 GarminPutWpts (&get_next_wpt, fdPtr, DmNumRecordsInCategory (WptDB, Prefs.wptcategory));
00262 handled = true;
00263 break;
00264
00265 case TransferRteReqEvent:
00266 GarminPutRtes (&get_next_rte, fdPtr, ItemsToSendInCategory (RteDB));
00267 handled = true;
00268 break;
00269
00270 case TransferTrkReqEvent:
00271 GarminPutTrks (&get_next_trk, fdPtr, ItemsToSendInCategory (TrkDB));
00272 break;
00273
00274 #ifdef EVENTS
00275 case AsyncEventReqEvent:
00276 {
00277 AsyncEventMask * evtmaskp=(AsyncEventMask *)& (e->data);
00278 if(*evtmaskp)GarminPutPacket (&get_next_packet, fdPtr, DmNumRecords (LogDB));
00279 }
00280 break;
00281 #endif
00282
00283 case TimeReceivedEvent:
00284 GPSTime = e->data.sclRepeat.time;
00285 TimeDiff = TimGetSeconds () - (GPSTime + (long) Prefs.utcoffset * 3600);
00286 SysCopyStringResource (gbuf1, StrTimeFormat);
00287 StrPrintF (gbuf2, gbuf1, TimeDiff);
00288 if (FrmCustomAlert (ConfID, " ", gbuf2, " "))
00289 TimSetSeconds (TimGetSeconds () - TimeDiff);
00290 IgnoreEooEvt = 1;
00291 FrmReturnToForm (0);
00292 handled = true;
00293 break;
00294
00295 case PositionReceivedEvent:
00296 PositionP = (Radian_Type *) & (e->data);
00297 debug (GTALKDBG_INFOS, ("ProgressFormHandleEvent(), got position : Lat=%ld", PositionP->lat));
00298 CurrentWGS84Pos.lat = PositionP->lat * OnePower31Pi;
00299 CurrentWGS84Pos.lon = PositionP->lon * OnePower31Pi;
00300
00301 debug (GTALKDBG_INFOS, ("ProgressFormHandleEvent(), CurrentWGS84Pos.lat=%ld",CurrentWGS84Pos.lat ));
00302 EditMode = MarkWpt;
00303 IgnoreEooEvt = 1;
00304 #ifndef SKIPEDIT
00305 FrmGotoForm (EditForm);
00306 #endif
00307 handled = true;
00308 break;
00309
00310 case PowerOffEvent:
00311 evt.eType = keyDownEvent;
00312 evt.data.keyDown.chr = hardPowerChr;
00313 evt.data.keyDown.keyCode = 0;
00314 evt.data.keyDown.modifiers = commandKeyMask;
00315 EvtAddEventToQueue (&evt);
00316 IgnoreEooEvt = 1;
00317 FrmReturnToForm (0);
00318 handled = true;
00319 break;
00320
00321 case EndOfOperationEvent:
00322 if (!IgnoreEooEvt)
00323 {
00324 MustCallGpslibTicks = 0;
00325 CleanUpTracks ();
00326 if (GpsOp<=gpsDownload){
00327 SysCopyStringResource (gbuf1, StrProgFormat);
00328 StrPrintF (gbuf2, gbuf1, TimGetSeconds () - start, New, Replaced, Sent);
00329 if (Verbose)
00330 FrmCustomAlert (AlertID, gbuf2, " ", " ");
00331 FrmReturnToForm (0);
00332 }
00333 else {
00334 HideObject(BtStopID);
00335 ShowObject(BtOKID);
00336 FldSetSelection (fdPtr, 0, FldGetTextLength (fdPtr));
00337 FldCopy (fdPtr);
00338 }
00339 }
00340 MainListDirty = 1;
00341 handled = true;
00342 break;
00343
00344 default:
00345 break;
00346 }
00347
00348 if (e->eType!=nilEvent) debug_out (GTALKDBG_CALLS, ("<-ProgressFormHandleEvent()=%d", handled));
00349 return handled;
00350 }
00351
00352
00360 Boolean
00361 DownloadFormHandleEvent (EventPtr e)
00362 {
00363 Boolean handled = false;
00364 FormPtr frm;
00365
00366 frm = FrmGetActiveForm ();
00367 switch (e->eType)
00368 {
00369 case frmOpenEvent:
00370 frm = FrmGetActiveForm ();
00371 if (*CurrentCategory == dmAllCategories)
00372 *CurrentCategory = 0;
00373 CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
00374 CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
00375
00376 if (Prefs.todisplay == DispTrk)
00377 ShowObject (DownCkID);
00378
00379 FrmDrawForm (frm);
00380 handled = true;
00381 break;
00382
00383 case frmCloseEvent:
00384 break;
00385
00386 case ctlSelectEvent:
00387 switch (e->data.ctlSelect.controlID)
00388 {
00389 case BtGoID:
00390 CompactTracks = GetControlValue (DownCkID);
00391
00392 GpsOp = gpsDownload;
00393 FrmGotoForm (ProgressForm);
00394 break;
00395 case BtCancelID:
00396 FrmReturnToForm (0);
00397 break;
00398 case MainCatPopupID:
00399 CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, false, CurrentCategory,
00400 CategoryName, 1, 0);
00401 break;
00402 }
00403 handled = true;
00404 break;
00405
00406 default:
00407 break;
00408 }
00409
00410 return handled;
00411 }
00412
00413
00421 Boolean
00422 UploadFormHandleEvent (EventPtr e)
00423 {
00424 Boolean handled = false;
00425 FormPtr frm;
00426
00427 frm = FrmGetActiveForm ();
00428 switch (e->eType)
00429 {
00430 case frmOpenEvent:
00431 frm = FrmGetActiveForm ();
00432 CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
00433 CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
00434
00435 Furuno = 0;
00436 FrmDrawForm (frm);
00437 handled = true;
00438 break;
00439
00440 case frmCloseEvent:
00441 break;
00442
00443 case ctlSelectEvent:
00444 switch (e->data.ctlSelect.controlID)
00445 {
00446 case BtGoID:
00447 GpsOp = gpsUpload;
00448 FrmGotoForm (ProgressForm);
00449 break;
00450 case BtCancelID:
00451 FrmReturnToForm (0);
00452 break;
00453 case MainCatPopupID:
00454 CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, true, CurrentCategory,
00455 CategoryName, 1, 0);
00456 break;
00457 }
00458 handled = true;
00459 break;
00460
00461 #ifdef FURUNO
00462 case keyDownEvent:
00463 if (e->data.keyDown.chr == pageDownChr)
00464 {
00465 WinDrawChars ("FURUNO", 6, 20, 80);
00466 Furuno = 1;
00467 }
00468 break;
00469 #endif
00470
00471 default:
00472 break;
00473 }
00474
00475 return handled;
00476 }
00477
00478
00487 static UInt
00488 ItemsToSendInCategory (DmOpenRef DB)
00489 {
00490 UInt n,
00491 c,
00492 t,
00493 cat;
00494 VoidHand RecH = NULL;
00495 GarminProtoID Proto;
00496
00497 c = n = 0;
00498 if (DB == WptDB) {
00499 #ifdef SELECT
00500 if (Prefs.selectmode){
00501 while ((RecH = DmQueryNextInCategory (DB, &c, Prefs.wptcategory)))
00502 if(RecIsSecret(DB,c++))n++;
00503 }
00504 else
00505 #endif
00506 n= DmNumRecordsInCategory (WptDB, Prefs.wptcategory);
00507 return(n);
00508 }
00509
00510 else if (DB == TrkDB){
00511 cat = Prefs.trkcategory;
00512 Proto=GarminGetProtocol(TrkProto);
00513 if (Proto==A000)Proto=A300;
00514 }
00515 else {
00516 cat = Prefs.rtecategory;
00517 Proto=GarminGetProtocol(RteProto);
00518 if (Proto==A000)Proto=A200;
00519 }
00520 if (Proto==A000)return(0);
00521
00522 while ((RecH = DmQueryNextInCategory (DB, &c, cat)))
00523 {
00524 if (!Prefs.selectmode
00525 #ifdef SELECT
00526 || RecIsSecret(DB, c)
00527 #endif
00528 ){
00529 if (DB == TrkDB){
00530 n += TrkptsInTrkDB (RecH)+ (Proto==A301?1:0) ;
00531 }
00532 else {
00533 t=WptsInRteDB (RecH);
00534 n += t + 1;
00535 if (Proto==A201) n+= --t;
00536 }
00537 }
00538 c++;
00539 }
00540 return (n);
00541 }
00542
00543
00544 static Boolean OkForGremlins (unsigned int prob){
00545 if(SysGremlins (GremlinIsOn, NULL))
00546 return (SysRandom(0)<=(sysRandomMax/prob));
00547 else return(1);
00548 }