Main Page | File List | Globals | Related Pages

gpsio.c

Go to the documentation of this file.
00001 
00008 /* 
00009    Copyright (C) 1999-2004 Christian Claveleira (Christian.Claveleira@cru.fr)
00010 */
00011 
00012 /*      $Id: gpsio.c,v 1.7 2004/04/10 20:08:45 clavelei Exp clavelei $   */
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             //CtlGetValue (GetObjPtr (HostCmptID));
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 }                                                          // HostFormHandleEvent
00102 
00103 
00111 Boolean
00112 ProgressFormHandleEvent (EventPtr e)
00113 {
00114     Boolean handled = false;
00115     //    FormPtr frm;
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;       /* flag pour ignorer EndOfOperationEvent */
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 () /* traiter future erreur renvoyee */ ;
00136         if (statp && (TimGetTicks () > t + sysTicksPerSecond / 3))
00137         {                                                  /* gadget */
00138             //buf[0]=0;
00139             StrNCopy (buf, p >= (statp + StrLen (statp)) ? p = statp : p, sizeof (buf));
00140             p++;
00141             StrNCat (buf, statp, sizeof (buf));
00142             //      buf[sizeof(buf)-1]=0;
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         //        frm = FrmGetActiveForm ();
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, /*0xffff */ 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);                           /* requete time */
00211             Prefs.todisplay -= 4;
00212             break;
00213 
00214         case gpsGetPosition:
00215             error=GarminGetPosition (fdPtr);                       /* requete de position */
00216             Prefs.todisplay -= 8;
00217             break;
00218 
00219         case gpsGetInfos:
00220           debug (GTALKDBG_INFOS, ("ProgressFormHandleEvent: before GarminGetRemoteInfos"));  // $$
00221             error=GarminGetRemoteInfos (fdPtr);            /* requete d'identification */
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 /*      FldSetSelection (fdPtr, 0, FldGetTextLength (fdPtr)); */
00243 /*      FldCopy (fdPtr);  */
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:                              /* requete de transfert de wpt */
00261         GarminPutWpts (&get_next_wpt, fdPtr, DmNumRecordsInCategory (WptDB, Prefs.wptcategory));
00262         handled = true;
00263         break;
00264 
00265     case TransferRteReqEvent:                              /* requete de transfert de routes */
00266         GarminPutRtes (&get_next_rte, fdPtr, ItemsToSendInCategory (RteDB));
00267         handled = true;
00268         break;
00269 
00270     case TransferTrkReqEvent:                              /* requete de transfert de traces */
00271         GarminPutTrks (&get_next_trk, fdPtr, ItemsToSendInCategory (TrkDB));
00272         break;
00273 
00274 #ifdef EVENTS
00275     case AsyncEventReqEvent:                               /* requete d'envoi d'events */
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:                                /* time recu */
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:                    /* position recue */
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         //  CurrentRecordIndex = dmMaxRecordIndex;
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:                            /* power off */
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     }                                                      // switch (e->eType)
00347 
00348     if (e->eType!=nilEvent) debug_out (GTALKDBG_CALLS, ("<-ProgressFormHandleEvent()=%d", handled));
00349       return handled;
00350 }                                                          // ProgressFormHandleEvent
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         //      CompactTracks=0;
00376         if (Prefs.todisplay == DispTrk)
00377             ShowObject (DownCkID);
00378         //      Upload = 0;
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             //CtlGetValue (GetObjPtr (DownCkID));
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 }                                                          //DownloadFormHandleEvent
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         //      Upload = 1;
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:                                     /* activation mode furuno */
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 }                                                          // UploadFormHandleEvent
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) {    /* wpt : simple, un item = un record */
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; // valeur par defaut provisoire $$
00514   }
00515   else {
00516     cat = Prefs.rtecategory;
00517     Proto=GarminGetProtocol(RteProto);
00518     if (Proto==A000)Proto=A200; // valeur par defaut provisoire $$
00519   }
00520   if (Proto==A000)return(0);  /* erreur */
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;  /* links */
00536         }
00537       }
00538       c++;
00539     }
00540   return (n);
00541 }                                                          /* ItemsToSendInCategory */
00542 
00543 
00544 static Boolean OkForGremlins (unsigned int prob){
00545   if(SysGremlins (GremlinIsOn, NULL))
00546     return (SysRandom(0)<=(sysRandomMax/prob)); /* if gremlins, return probability */
00547   else return(1);
00548 }

Generated on Sun Aug 29 11:00:40 2004 for GPilotS by doxygen 1.3.4