Global variables are not available for some launch codes, including
reset. You access globals (serial_port_choice and speed_choice) in
PilotMain() before you know if globals are available, which will
likely cause a reset, thus a reset loop.

Check the launch code before doing anything else.

On Thu, Nov 5, 2009 at 1:22 PM, Shorin <vigilante.sho...@gmail.com> wrote:
> Yeah, I determined that it was my particular app. It doesn't matter if
> I'm debugging or not. My app always causes a reset loop if I use it.
> Also, it didn't free up the bluetooth resources either... even though I
> explicitly had it close the port and library.
>
> I've not had much luck trying to write bluetooth apps.
> I can attach the entire source for the program... can anyone point out
> something I'm doing wrong right off the bat?
>
> Thanks
>
> Kasny J. wrote:
>>> Hi,
>>>
>>> I'm attempting to use the Palm OS Debugger to debug my apps on a
>>> device. Whenever I'm finished, the device goes into a reset loop and
>>> continues to do so until I delete my app that I installed. I dunno
>>> why it does this. Its a bluetooth app, but I don't think I'm doing
>>> anything I shouldn't.
>>
>> It is normal, that the device goes into the reset loop after finish.
>> But the loop reset is propably caused by your application. Maybe
>> memory leak or something like this. Or insufficient memory space.
>> Check it.
>>
>> zozo
>>
>> __________ Informace od ESET NOD32 Antivirus, verze databaze 4573
>> (20091104) __________
>>
>> Tuto zpravu proveril ESET NOD32 Antivirus.
>>
>> http://www.eset.cz
>>
>>
>>
>>
>
> --
> For information on using the ACCESS Developer Forums, or to unsubscribe, 
> please see http://www.access-company.com/developers/forums/
>  /******************************************************************************
>  *
>  * Copyright (c) 2007, ACCESS Systems Americas, Inc. All Rights Reserved.
>  *
>  * File: AppMain.c
>  *
>  *****************************************************************************/
> #include "PalmOS.h"
> #include <Event.h>
> #include <SysEvent.h>
>
>
> #include "../rsc/AppResources2.h"
>
> #include "AppMain.h"
> #include "BtCommVdrv.h"
> #include "SerialMgr.h"
> #include "FeatureMgr.h"
> #include "BtLib.h"
> /***********************************************************************
>  *
>  *      Entry Points
>  *
>  ***********************************************************************/
>
>
> /***********************************************************************
>  *
>  *      Internal Constants
>  *
>  ***********************************************************************/
> #define appFileCreator                  'SHRN'  // register your own at 
> http://www.palmos.com/dev/creatorid/
> #define appVersionNum                   0x01
> #define appPrefID                               0x00
> #define appPrefVersionNum               0x01
>
>
>  void OpenPort(void);
>
>  void Disconnect(void);
>
>  void SendString(void);
>
>  void ServerOpen(void);
>  void GetReceivedData(void);
>
> UInt32 ports[12] = {
>        serPortLocalHotSync,
>        serPortCradlePort,
>        serPortIrPort,
>        serPortConsolePort,
>        serPortCradleRS232Port,
>        serPortCradleUSBPort,
>        sysFileCUart328,
>        sysFileCUart328EZ,
>        sysFileCUart650,
>        sysFileCVirtIrComm,
>        sysFileCVirtRfComm,
>        sysFileCBtConnectPanelHelper };
> UInt32 speeds[10] = {
>        115200,
>        57600,
>        38400,
>        28800,
>        19200,
>        14400,
>        9600,
>        4800,
>        2400,
>        1200};
>
> UInt32 serial_port_choice;
> UInt32 speed_choice;
>
> /* CODE FROM http://www.webalice.it/rodolfo.turco/DevelTips.html#Tip9
>  *
>  *
> Here is a simple way to communicate with your bluetooth serial device,
> this example code  is as simple as possible you have to implement the
> errors management.
>
> You have to:
> 1) Load the Library
> 2) Find a device if not already known
> 3) Open the connection
> 4) Use it (Receive, Send, Flush, etc.)
> 5) Close the connection
>
> */
>
> /**************/
> /* BT Globals      */
> /**************/
> static UInt16 unPortId;
> static UInt16 btLibRefNum;
> static UInt8   cAddress[6];
> static Err err;
> static SrmOpenConfigType config;
> static BtVdOpenParams    btParams;
> static BtLibSdpUuidType  sppUuid;
> /************************************/
> /* Pause n milliseconds                                    */
> /************************************/
> static void Uti_WaitMilliSec(UInt32 ulMilliSec)
> {
>  UInt16  unTickPerSec;
>
>  unTickPerSec=SysTicksPerSecond();
>  if(unTickPerSec)
>  SysTaskDelay(ulMilliSec*unTickPerSec/1000);
>  else
>  SysTaskDelay(ulMilliSec/10);
> }
> /**************************************/
> /* Close a Bluetooth serial connetion                    */
> /**************************************/
> static void BT_Close()
> {
>  if(unPortId)
>  {
>   SrmClose(unPortId);
>   unPortId=0;
>   Uti_WaitMilliSec(500);
>   SrmClose(unPortId); // Retry, on some system it's hard to die
>  }
> }
> /*************************************/
> /* Open a Bluetooth serial connetion                  */
> /*************************************/
> static void BT_Open()
>  {
>  BT_Close();
>  MemSet(&sppUuid, sizeof(sppUuid), 0);
>  sppUuid.size = btLibUuidSize16;
>  sppUuid.UUID[0] = 0x11;
>  sppUuid.UUID[1] = 0x01;
>  MemSet(&btParams, sizeof(btParams), 0);
>  btParams.u.client.remoteDevAddr.address[0]=cAddress[0];
>  btParams.u.client.remoteDevAddr.address[1]=cAddress[1];
>  btParams.u.client.remoteDevAddr.address[2]=cAddress[2];
>  btParams.u.client.remoteDevAddr.address[3]=cAddress[3];
>  btParams.u.client.remoteDevAddr.address[4]=cAddress[4];
>  btParams.u.client.remoteDevAddr.address[5]=cAddress[5];
>  btParams.role = btVdClient;
>  btParams.u.client.method = btVdUseUuidList;
>  btParams.u.client.u.uuidList.tab = &sppUuid;
>  btParams.u.client.u.uuidList.len = 1;
>  MemSet(&config, sizeof(config), 0);
>  config.function = serFncUndefined;
>  config.drvrDataP = (MemPtr)&btParams;
>  config.drvrDataSize = sizeof(btParams);
>  err=SrmExtOpen(sysFileCVirtRfComm,&config,sizeof(config),&unPortId);
>  }
>
> //Server Listen
> static void BT_Server_Listen()
>  {
>  BT_Close();
>  MemSet(&sppUuid, sizeof(sppUuid), 0);
>  sppUuid.size = btLibUuidSize16;
>  sppUuid.UUID[0] = 0x11;
>  sppUuid.UUID[1] = 0x01;
>  MemSet(&btParams, sizeof(btParams), 0);
>  btParams.role = btVdServer;
>  btParams.u.client.method = btVdUseUuidList;
>  btParams.u.client.u.uuidList.tab = &sppUuid;
>  btParams.u.client.u.uuidList.len = 1;
>  MemSet(&config, sizeof(config), 0);
>  config.function = serFncUndefined;
>  config.drvrDataP = (MemPtr)&btParams;
>  config.drvrDataSize = sizeof(btParams);
>  btParams.u.server.name = "PalmView";
>  err=BtLibOpen(btLibRefNum,false);
>  if(err==0)
>        BtLibSdpUuidInitialize(btParams.u.server.uuid, 
> btLibSdpUUID_SC_SERIAL_PORT, btLibUuidSize16);
>  BtLibClose(btLibRefNum);
>
>  err=SrmExtOpen(sysFileCVirtRfComm,&config,sizeof(config),&unPortId);
>  }
> /***************************/
> /* Find a BT device on air             */
> /***************************/
> static void BT_FindDevice()
> {
>  BT_Close();
>
>  if(btLibRefNum)
>  {
>   err=BtLibOpen(btLibRefNum,false);
>   if(err==0)
>     err=BtLibDiscoverSingleDevice(btLibRefNum,NULL,NULL,0, 
> (BtLibDeviceAddressType *)cAddress,false,true);
>   BtLibClose(btLibRefNum);
>  }
> }
> /***********************/
> /* Load the BT library           */
> /***********************/
> static void BT_LoadLibrary()
> {
>  btLibRefNum=0;
>
>  err=SysLibFind("Bluetooth Library",&btLibRefNum);
>  if(err)
>  err=SysLibLoad(sysFileTLibrary,sysFileCBtLib,&btLibRefNum);
> }
> /****************/
> /* Flush BT ser        */
> /****************/
> static void BT_Flush(UInt16 unTimeout)
> {
>  if(unPortId)
>   err=SrmReceiveFlush(unPortId,unTimeout);
> }
> /****************/
> /* Send BT data      */
> /****************/
> static void BT_Send(char * pData,UInt16 unLen)
> {
>  SrmSendFlush(unPortId);
>  if(unPortId){
>   SrmSend(unPortId,pData,unLen,&err);
>   if(err == errNone)
>      SrmSendFlush(unPortId);
>  }
> }
> /*******************/
> /* Receive BT data        */
> /*******************/
> static UInt16 BT_Receive(char * pData,UInt16 unLen,UInt16 unTimeout)
> {
>  UInt16 unLenRead;
>  if(unPortId)
>   unLenRead=SrmReceive(unPortId,pData,unLen,unTimeout,&err); //It resets on 
> this line in server mode... i wonder why? Do i have to flush beforehand?
>  return(unLenRead);
> }
>
>
> /***********************************************************************
>  *
>  * FUNCTION:    PilotMain
>  *
>  * DESCRIPTION: This is the main entry point for the application.
>  *
>  * PARAMETERS:  cmd - word value specifying the launch code.
>  *              cmdPB - pointer to a structure that is associated with the 
> launch code.
>  *              launchFlags -  word value providing extra information about 
> the launch.
>  * RETURNED:    Result of launch
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
> {
>        Err error = errNone;
>
>        serial_port_choice= ports[0]; //just use default or 
> whatever:serPortLocalHotsync
>        speed_choice = speeds[0]; //115200
>
>        switch (cmd) {
>                case sysAppLaunchCmdNormalLaunch:
>                        if ((error = AppStart()) == 0) {
>                                AppEventLoop();
>                                AppStop();
>                        }
>                        break;
>
>                default:
>                        break;
>        }
>
>        return error;
> }
>
>
>
> /***********************************************************************
>  *
>  *      Internal Functions
>  *
>  ***********************************************************************/
>
>
> /***********************************************************************
>  *
>  * FUNCTION:    MainFormDoCommand
>  *
>  * DESCRIPTION: This routine performs the menu command specified.
>  *
>  * PARAMETERS:  command  - menu item id
>  *
>  * RETURNED:    nothing
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> static Boolean MainFormDoCommand(UInt16 command)
> {
>        Boolean handled = false;
>        FormType * pForm;
>
>        switch (command) {
>                case kMainFormMenuBarAboutPalmViewMenuItem:
>                        pForm = FrmInitForm(kAboutForm);
>                        FrmDoDialog(pForm);                                    
>  // Display the About Box.
>                        FrmDeleteForm(pForm);
>                        handled = true;
>                        break;
>
>        }
>
>        return handled;
> }
>
>
> /***********************************************************************
>  *
>  * FUNCTION:    MainFormHandleEvent
>  *
>  * DESCRIPTION: This routine is the event handler for the
>  *              "MainForm" of this application.
>  *
>  * PARAMETERS:  pEvent  - a pointer to an EventType structure
>  *
>  * RETURNED:    true if the event has handle and should not be passed
>  *              to a higher level handler.
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
>
>
> static Boolean MainFormHandleEvent(EventType* pEvent)
> {
>        Boolean         handled = false;
>        FormType*       pForm;
>        UInt16 index;
>        struct popSelect* structure;
>
>        switch (pEvent->eType) {
>                case menuEvent:
>                        return MainFormDoCommand(pEvent->data.menu.itemID);
>
>                case frmOpenEvent:
>                        pForm = FrmGetActiveForm();
>                        FrmDrawForm(pForm);
>                        handled = true;
>                        break;
>                case popSelectEvent:
>                        structure = &pEvent->data;
>                        switch(structure->listID)//we don't care what control 
> it was ... the list tells us enough.
>                        {
>                                case kMainFormPortList:
>                                        index = structure->selection;
>                                        if(index > -1 && index < 12)
>                                                
> serial_port_choice=ports[index];
>                                        //handled = true;
>                                        break;
>                                case kMainFormSpeedList:
>                                        index = structure->selection;
>                                        if(index > -1 && index < 10) //no 
> selection is = -1.
>                                                
> speed_choice=speeds[index];//our nifty pre-list.
>                                        //handled = true;
>                                        break;
>                                default:
>                                        break;
>                        }
>                        break;
>                case ctlSelectEvent:
>                        switch(pEvent->data.ctlSelect.controlID)
>                        {
>                        case kMainFormConnectSerialPortButton:
>                                //Open the connection... and stuff- DRAT we 
> can't do this on the simulator!
>                                OpenPort();
>                                break;
>                        case kMainFormDisconnectButton:
>                                //Disconnect?
>                                Disconnect();
>                                break;
>                        case kMainFormSendButton:
>                                SendString();
>                                break;
>                        case kMainFormStartServerButton:
>                                ServerOpen();
>                                break;
>                        case kMainFormWaitforDataButton:
>                                GetReceivedData();
>                                break;
>                        default:
>                                break;
>                        }
>                        break;
>                default:
>                        break;
>        }
>
>        return handled;
> }
>
> //Quickly returns the data if it has been sent
> void GetReceivedData(void)
> {
>        UInt32 bytes;
>        MemHandle buffer;
>        char* edit_buffer;
>        FormPtr         frm;
>        FieldPtr        fld;
>        UInt16          obj;
>        UInt16 b;
>
>        frm = FrmGetFormPtr(kMainForm);
>        obj = FrmGetObjectIndex(frm, kMainFormSendStrField);
>        fld = (FieldPtr)FrmGetObjectPtr(frm, obj);
>
>        bytes=0;
>        err = SrmReceiveCheck(unPortId, &bytes);
>        if(bytes == 0)
>                return;
>
>        buffer = MemHandleNew(bytes + sizeof(char));
>        if(buffer == 0)
>        {
>                ErrDisplay("Couldn't allocate memory to receive data!");
>                return;
>        }
>
>
>        BT_Receive(buffer, bytes, 300);
>        if(err != 0)
>        {
>                ErrDisplay("Timeout or error occurred.");
>        }
>
>        BT_Flush(300);
>        if(err != 0)
>        {
>                ErrDisplay("Timeout or error occurred.");
>        }
>
>        // Add a null char to the end of the new string.
>        b = StrLen(buffer);
>        edit_buffer = (char *)MemHandleLock(buffer);
>        edit_buffer[b-1] = '\0';
>        MemHandleUnlock(buffer);
>
>
>        //free the old string, if it exists.
>        FldFreeMemory(fld);
>
>        //Set the new string!
>        FldSetText(fld, buffer, 0, bytes+sizeof(char));
> }
>
> void ServerOpen(void)
> {
>
>        BT_LoadLibrary();
>        if(err != 0)
>        {
>                ErrDisplay("Couldn't load BT library!");
>        }
>        BT_Server_Listen();
>        if(err != 0)
>        {
>                ErrDisplay("Couldn't Open BT Connection for listening!");
>        }
>
>        //** USE ThE CONNECTION HERE!
> }
> void SendString(void)
> {
>        FormPtr         frm;
>        FieldPtr        fld;
>        UInt16          obj;
>        Char* textstr;
>
>        frm = FrmGetFormPtr(kMainForm);
>        obj = FrmGetObjectIndex(frm, kMainFormSendStrField);
>        fld = (FieldPtr)FrmGetObjectPtr(frm, obj);
>
>        textstr = FldGetTextPtr(fld);
>        if(textstr == NULL)
>                return;
>        if(StrLen(textstr) == 0)
>                return;
>
>        BT_Send(textstr, StrLen(textstr));
>        if(err != 0)
>        {
>                ErrDisplay("Some kind of sending error!");
>        }
> }
> void OpenPort(void)
> {
>        /////////////////////////////////////
>        //CHECK FOR FEATURE AVAILABILITY
>
>        /*UInt32 btVersion;
>
>        // Make sure Bluetooth components are installed
>        // This check also ensures Palm OS 4.0 or greater
>        if (FtrGet(btLibFeatureCreator, btLibFeatureVersion,
>                &btVersion) != errNone)
>        {
>                // Alert the user if it's the active application
>                if ((launchFlags & sysAppLaunchFlagNewGlobals) &&
>                        (launchFlags & sysAppLaunchFlagUIApp))
>                        FrmAlert (MissingBtComponentsAlert);
>                return;
>        } */
>        //////////////////////////////////////
>
>        /*
>        //////////////////////////////////////
>        // Load the BT Lib
>        UInt16 btLibRefNum;
>        UInt16 portId;
>        Boolean serPortOpened = false;
>        Err err;
>        UInt32 tos;
>        UInt32 numSent;
>        Char msg[] = "logon\n";
>        SrmOpenConfigType config;
>        BtVdOpenParams params;
>        BtLibSdpUuidType sdp_param;
>
>        err = SysLibFind(btLibName, &btLibRefNum);
>        if (err == 0) {
>
>                err = SysLibLoad(sysFileTLibrary, sysFileCBtLib,
>                                                &btLibRefNum);
>                if(err != errNone)
>                        return;
>        }else{
>                FrmCustomAlert(ID_MSG_ALERT, "Error", "Couldn't load BT Lib 
> Library", " ");
>                return;
>        }
>
>        //////////////////////////////////////
>
>        //////////////////////////////////////
>        // Open the BT library
>        // Only open the BT library if you need to use a function from it (?)
>
>        err = BtLibOpen (btLibRefNum, false);
>        if(err != errNone)
>                return;
>
>        /*FormPtr frm;
>        UInt16 focus;
>        FormObjectKind objType;
>
>        frm = FrmGetActiveForm();
>        FieldPtr TblGetCurrentField(FrmGetObjectPtr(frm, focus))
>        */
> //      UInt16 focus;
> //      FormObjectKind objType;
>
>        //It doesn't like UInt32 in the middle of the function for some reason.
>
>        //Read the value on the form
>
>        //frm = FrmGetActiveForm();
>        //TblGetCurrentField(FrmGetObjectPtr(frm, focus))
>         //Alternate is sysFileCVirtRfComm but we probably have to use 
> SrmExtOpen with special BT settings.
>         // See 
> http://www.mail-archive.com/palm-dev-forum@news.palmos.com/msg61007.html
>        //we want a BK connection because we will eventually exit this app.
>
>        //Background connection didn't work... lets try foreground connection.
>        //Trying something new
> /*
> #define BT_CLIENT
>
> #ifdef BT_CLIENT
>
> // Fix a bug in the Bluetooth SDK?
> #ifdef BtLibSdpUuidInitialize
> #undef BtLibSdpUuidInitialize
> #endif
> #define BtLibSdpUuidInitialize(uuid, define, defineSize)  { (uuid).size = 
> (defineSize); \
>  MemMove((uuid).UUID, (define), (uuid).size); }
>
>        //sdp_param.size = btLibUuidSize16;
>        //BtLibSdpUuidInitialize(sdp_param,  btLibSdpUUID_SC_SERIAL_PORT, 
> btLibUuidSize16);
>
>        params.role = btVdClient;
>        params.u.client.remoteDevAddr.address[0] = 0;
>        params.u.client.remoteDevAddr.address[1] = 0;
>        params.u.client.remoteDevAddr.address[2] = 0;
>        params.u.client.remoteDevAddr.address[3] = 0;
>        params.u.client.remoteDevAddr.address[4] = 0;
>        params.u.client.remoteDevAddr.address[5] = 0;
>
>        params.u.client.method = btVdUseUuidList;
>        //params.u.client.u.uuidList.tab = &sdp_param; //line used to be gone.
>        params.u.client.u.uuidList.len = 0;
>
>
>
> #else
> //TRYING SERVER LISTENING VERSION.
>
>
>                params.role = btVdServer;
>                BtLibSdpUuidInitialize(params.u.server.uuid, 
> btLibSdpUUID_SC_SERIAL_PORT, btLibUuidSize16);
>                params.u.server.name = "PalmView";
>
> #endif
>        //params.authenticate = false;
>        //params.encrypt = false;
>
>        config.baud = 9600;
>        config.function = serFncUndefined;
>        config.drvrDataP = &params;
>        config.drvrDataSize = sizeof(params);
>
>        config.sysReserved1 = 0;
>        config.sysReserved2 = 0;
>
>        BtLibClose(btLibRefNum);
>        err = SrmExtOpen(sysFileCVirtRfComm, &config, sizeof(config), &portId);
>        if ((err == errNone) || (err == serErrAlreadyOpen))
>                serPortOpened = true;
>        else{
>                ErrDisplay("Couldn't open BT port.");
>                ErrAlert(err);
>                return;
>        }
>                */
>        /*err = SrmOpen(serial_port_choice  , speed_choice,  &portId);  
> //changed from "SrmOpenBackground"
>        if (err) {
>           //Display error here.
>           //ErrDisplay("Connection error! Are you running this in the 
> simulator?");
>           switch(err){
>           case serErrAlreadyOpen:
>                        ErrDisplay("Port already open");
>                        break;
>                case serErrBadPort:
>                        ErrDisplay("Bad port");
>                        return;
>                        break;
>                case memErrNotEnoughSpace:
>                        ErrDisplay("Not enough memory to open the port");
>                        return;
>                        break;
>           }
>           ErrAlert(err);
>           //We are not returning on the already open one because it might be 
> non-fatal, as I saw in someone else's code.
>        }*/
>        /*//record our open status in global.
>        serPortOpened = true;
>
>        ///////////
>        //Test send
>
>        tos = StrLen(msg);
>        numSent = SrmSend(portId, msg, tos, &err);
>        if (err == serErrTimeOut) {
>          //cts timeout detected
>          //ErrDisplay("Send Error!");
>          ErrAlert(err);
>          SrmClose(portId);
>          return;
>        }
>        SrmClose(portId); //no errors hopefully.
>        ErrAlert(1000); //success message.
>        */
>        BT_LoadLibrary();
>        if(err != 0)
>        {
>                ErrDisplay("Couldn't load BT library!");
>        }
>        BT_FindDevice();
>        if(err != 0)
>        {
>                ErrDisplay("Couldn't find a device, or cancelled or 
> something...");
>        }
>        BT_Open();
>        if(err != 0)
>        {
>                ErrDisplay("Couldn't Open BT Connection!");
>        }
>
>        //** USE ThE CONNECTION HERE!
>
> }
>
> //Disconnect fcn... closes the connection.
> void Disconnect()
> {
>        BT_Flush(1500); //flush, with timeout.
>        if(err != 0)
>        {
>                ErrDisplay("Flush failed");
>        }
>        BT_Close();
>        if(err != 0)
>        {
>                ErrDisplay("Unable to close BT Connection");
>        }
>
>        err = BtLibClose(btLibRefNum);
>        if( err == btLibErrNotOpen )
>        {
>                ErrDisplay("BT Lib was not open, you didn't need to close 
> it.");
>        }else if(err != 0){
>                ErrDisplay("Some other error with closing the bt lib!");
>        }
>
>
>        err=SysLibRemove(btLibRefNum); //This might be a BAD idea (like 
> unloading it from future app's use!) so we won't bother with this for now.
>        if(err != 0)
>        {
>                ErrDisplay("Unable to unload BT Lib");
>        }
> }
> /***********************************************************************
>  *
>  * FUNCTION:    AppHandleEvent
>  *
>  * DESCRIPTION: This routine loads form resources and set the event
>  *              handler for the form loaded.
>  *
>  * PARAMETERS:  event  - a pointer to an EventType structure
>  *
>  * RETURNED:    true if the event has handle and should not be passed
>  *              to a higher level handler.
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> static Boolean AppHandleEvent(EventType* pEvent)
> {
>        UInt16          formId;
>        FormType*       pForm;
>        Boolean         handled = false;
>
>        if (pEvent->eType == frmLoadEvent) {
>                // Load the form resource.
>                formId = pEvent->data.frmLoad.formID;
>
>                pForm = FrmInitForm(formId);
>                FrmSetActiveForm(pForm);
>
>                // Set the event handler for the form.  The handler of the 
> currently
>                // active form is called by FrmHandleEvent each time is 
> receives an
>                // event.
>                switch (formId) {
>                        case kMainForm:
>                                FrmSetEventHandler(pForm, MainFormHandleEvent);
>                                break;
>
>                        default:
>                                break;
>                }
>                handled = true;
>        }
>
>        return handled;
> }
>
>
> /***********************************************************************
>  *
>  * FUNCTION:     AppStart
>  *
>  * DESCRIPTION:  Get the current application's preferences.
>  *
>  * PARAMETERS:   nothing
>  *
>  * RETURNED:     Err value errNone if nothing went wrong
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> static Err AppStart(void)
> {
>        FrmGotoForm(kMainForm);
>        return errNone;
> }
>
>
> /***********************************************************************
>  *
>  * FUNCTION:    AppStop
>  *
>  * DESCRIPTION: Save the current state of the application.
>  *
>  * PARAMETERS:  nothing
>  *
>  * RETURNED:    nothing
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> static void AppStop(void)
> {
>        // Close all the open forms.
>        FrmCloseAllForms();
> }
>
>
> /***********************************************************************
>  *
>  * FUNCTION:    AppEventLoop
>  *
>  * DESCRIPTION: This routine is the event loop for the application.
>  *
>  * PARAMETERS:  nothing
>  *
>  * RETURNED:    nothing
>  *
>  * REVISION HISTORY:
>  *
>  *
>  ***********************************************************************/
> static void AppEventLoop(void)
> {
>        Err                     error;
>        EventType       event;
>
>        do {
>                EvtGetEvent(&event, evtWaitForever);
>
>                if (SysHandleEvent(&event))
>                        continue;
>
>                if (MenuHandleEvent(0, &event, &error))
>                        continue;
>
>                if (AppHandleEvent(&event))
>                        continue;
>
>                FrmDispatchEvent(&event);
>
>        } while (event.eType != appStopEvent);
> }
>
>
>
>
>



-- 
[Jeff Loucks, Gig Harbor, WA, USA]

-- 
For information on using the ACCESS Developer Forums, or to unsubscribe, please 
see http://www.access-company.com/developers/forums/

Reply via email to