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 = ¶ms; > 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/