palm-os-sdk/PalmOne/Samples/_RadioSample/Src/RadioSampleMain.c

595 lines
13 KiB
C

/******************************************************************************
* Copyright (c) 2004-2006 Palm,Inc. or its subsidiaries.
* All rights reserved.
*****************************************************************************/
/**
@ingroup RadioSample
*/
/**
* @brief This file contains code that shows how to detect if the radio is off or on,
* how to turn on the radio, how to turn off the radio, how to query the sim card for
* the phone number of the device, how to check if the device has service available
* using the signal level.
*
*
* @version 1.0 - Initial Revision (02/18/04)
* @version 1.1 - GSM or CDMA check in PrvGetMobileInfo (10/31/06) - Usha Shekar
* - Separated common functions from specific RadioSample related ones.
*
* @file RadioSample.c
*/
#include <PalmOS.h>
#include <HsNav.h>
#include <HsExt.h>
#include <HsPhone.h>
#include "Common.h"
#include "RadioSample.h"
#include "RadioSample_Rsc.h"
#include <TelephonyMgr.h>
#include "MobileServices.h"
extern void MainFormInit(void );
extern void MainFormDeinit(void );
Boolean ProcessEvent(EventType* eventP);
typedef struct
{
Char String [ 500 ];
} DBRecordType;
static void PrvFunctionPrintMessage( Char *stringOneP,
Char *stringTwoP,
Char *stringThreeP );
/**
* @brief PrvTurnRadioOnOff
* This function turns the radio on or off depending on the request
*
* @param turnRadioOn: IN: turnRadioOn, yes or no?
* @retval Err: Error code if there is error, else errNone
*
* @version This function was added in version 1.0
*
**/
static Err PrvTurnRadioOnOff( Boolean turnRadioOn )
{
UInt16 telRefNum;
Err error = errNone;
FieldPtr fieldDebugP = (FieldPtr)NULL;
FieldPtr fieldRadioP = (FieldPtr)NULL;
FormType *frmP = (FormType *)FrmGetActiveForm( );
Boolean phoneStartPowerState;
UInt32 cmd = 0;
Char conversionString [ 50 ];
fieldDebugP = (FieldPtr)FrmGetPtr( frmP, MainDebugField );
fieldRadioP = (FieldPtr)FrmGetPtr( frmP, MainRadioField );
error = HsGetPhoneLibrary(&telRefNum);
if (error)
{
PrvFunctionPrintMessage( "Couldn't load Telephony Library!", "", "");
return error;
}
error = (UInt8)PhnLibOpen(telRefNum);
if (error)
{
PrvFunctionPrintMessage( "Couldn't open Telephony Library!", "", "");
return error;
}
/* Is the radio on or off? */
phoneStartPowerState = (unsigned char)PhnLibModulePowered(telRefNum);
/* turn radio on if not already on */
if (turnRadioOn == true)
{ if (!phoneStartPowerState)
{
error = (UInt8)PhnLibSetModulePower(telRefNum, true);
SetFieldTextFromStr( fieldRadioP, "Radio on", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
else
{
SetFieldTextFromStr( fieldRadioP, "Radio already on", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
}
/* turn radio off if not already off */
else
{ if (phoneStartPowerState)
{
error = (UInt8)PhnLibSetModulePower(telRefNum, false);
SetFieldTextFromStr( fieldRadioP, "Radio off", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
else
{
SetFieldTextFromStr( fieldRadioP, "Radio already off", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
}
if ( error )
{
Char conversionString[ 30 ];
SetFieldTextFromStr( fieldDebugP, "Error Turning Phone On/Off", true );
FrmCustomAlert( RomIncompatibleAlert, "Error Turning Phone On/Off = ",
StrIToH( conversionString, error ), "" );
}
PhnLibClose(telRefNum);
return ( error );
}
/**
* @brief PrvGetMobileInfo
* This function gets the following info:
* 1. Is the radio on or off?
* 2. What is the phone number stored in the Sim card?
* 3. What is the signal level?
*
*
*
* @param void: IN: empty
* @retval Err: Error code if there is error, else errNone
*
* @version This function was added in version 1.0
* @version 1.1 - GSM or CDMA check (10/31/06) - Usha Shekar
*
**/
static Err PrvGetMobileInfo( void )
{
Err err = errNone;
FieldPtr fieldRadioP = (FieldPtr)NULL;
FieldPtr fieldPhoneP = (FieldPtr)NULL;
FieldPtr fieldSignalLevelP = (FieldPtr)NULL;
FormType *frmP = (FormType *)FrmGetActiveForm( );
UInt16 telRefNum = 0;
UInt32 cmd = 0;
Char conversionString [ 50 ];
FieldPtr fieldDebugP = (FieldPtr)NULL;
Boolean phoneStartPowerState;
PhnAddressList aList;
PhnAddressHandle address;
CharPtr number = NULL;
UInt16 quality = 0;
UInt32 phnType;
fieldDebugP = (FieldPtr)FrmGetPtr( frmP, MainDebugField );
fieldRadioP = (FieldPtr)FrmGetPtr( frmP, MainRadioField );
fieldPhoneP = (FieldPtr)FrmGetPtr( frmP, MainPhoneField );
fieldSignalLevelP = (FieldPtr)FrmGetPtr( frmP, MainSignalLevelField );
err = HsGetPhoneLibrary(&telRefNum);
if (err)
{
PrvFunctionPrintMessage( "Couldn't load Telephony Library!", "", "");
return err;
}
/* Is the radio on or off? */
phoneStartPowerState = (unsigned char)PhnLibModulePowered(telRefNum);
/* Open the phone library */
err = (unsigned short)PhnLibOpen(telRefNum);
if (phoneStartPowerState)
{
SetFieldTextFromStr( fieldRadioP, "Radio is on", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
else
{
SetFieldTextFromStr( fieldRadioP, "Radio is off", true);
SetFieldTextFromStr( fieldDebugP, StrIToH (conversionString, (UInt32) cmd), true);
}
/* What is the phone number stored in the Sim card? */
err = (unsigned short)PhnLibGetOwnNumbers(telRefNum, &aList);
if (err)
SetFieldTextFromStr(fieldPhoneP, "Unavailable", true);
else
{
/* GSM or CDMA? */
HsAttrGet (hsAttrPhoneType, 0, &phnType);
if ( phnType == hsAttrPhoneTypeGSM)
{
err = (unsigned short)PhnLibGetNth(telRefNum, aList, 1, &address);
if (!err)
{
number = (char *)PhnLibGetField(telRefNum, address, phnAddrFldPhone);
}
}
else
{
err = (unsigned short)PhnLibAPGetNth(telRefNum, aList, 1, &address);
if (!err)
{
number = (char *)PhnLibAPGetField(telRefNum, address, phnAddrFldPhone);
}
}
MemHandleFree(address);
MemHandleFree(aList);
if (number == NULL)
{
SetFieldTextFromStr(fieldPhoneP, "Unavailable", true);
MemPtrFree(number);
}
else
{
SetFieldTextFromStr(fieldPhoneP, number, true);
MemPtrFree(number);
number = NULL;
}
}
/* What is the signal level? */
err = (unsigned short)PhnLibSignalQuality (telRefNum, &quality);
if (!err)
SetFieldTextFromStr(fieldSignalLevelP, StrIToA(conversionString, quality), true);
else
SetFieldTextFromStr(fieldSignalLevelP, "No signal", true);
PhnLibClose(telRefNum);
return ( err );
}
/**
* @brief ProcessEvent
* This function processes the event
*
* @param eventP IN: the event to be processed
* @retval Boolean: true if event was handled
*
* @version This function was added in version 1.1
*
**/
Boolean ProcessEvent(EventType * eventP)
{
Boolean handled = false;
Err err = errNone;
FormType *frmP = FrmGetActiveForm( );
FieldPtr fieldDebugP = (FieldPtr)NULL;
fieldDebugP = (FieldPtr)FrmGetPtr( frmP, MainDebugField );
switch (eventP->data.ctlSelect.controlID)
{
case MainMobileButton:
// The "Get Mobile Info" button was hit.
// Get the following mobile info - is the radio on?, phone # and signal level
err = PrvGetMobileInfo( );
if (err != errNone)
{
SetFieldTextFromStr( fieldDebugP, "No Mobile Info", true );
}
handled = true;
break;
case MainRadioOnButton:
// The "Radio On" button was hit
// Turn the radio On
err = PrvTurnRadioOnOff( true );
if (err != errNone)
{
SetFieldTextFromStr( fieldDebugP, "Error Turning Phone On/Off", true );
}
handled = true;
break;
case MainRadioOffButton:
// The "Radio Off" button was hit
// Turn the radio Off
err = PrvTurnRadioOnOff( false );
if (err != errNone)
{
SetFieldTextFromStr( fieldDebugP, "Error Turning Phone On/Off", true );
}
handled = true;
break;
default:
break;
}
return handled;
}
/*
* FUNCTION: MainFormDoCommand
*
* DESCRIPTION: This routine performs the menu command specified.
*
* PARAMETERS:
*
* command
* menu item id
*/
Boolean MainFormDoCommand(UInt16 command)
{
Boolean handled = false;
UInt16 cardNo;
LocalID dbID;
DmSearchStateType searchState;
DmGetNextDatabaseByTypeCreator(true, &searchState, sysFileTApplication,
appCreatorID, true, &cardNo, &dbID);
switch (command)
{
case MainOptionsAbout:
MenuEraseStatus(0);
HsAboutHandspringApp(cardNo, dbID, "2006", "Palm DTS Team");
handled = true;
break;
default:
break;
}
return handled;
}
/**
* @brief MainFormHandleEvent
* Main form event handler.
*
*
* @param *eventP : IN: Pointer to an event.
* @retval boolean: True if event was handled.
*
*
* @version This function was added in version 1.0
*
**/
Boolean MainFormHandleEvent( EventType *eventP )
{
Boolean handled = false;
FormType *frmP = FrmGetActiveForm( );
switch (eventP->eType)
{
case frmOpenEvent:
MainFormInit( );
// Set focus on MainRadioOnButton button
FrmSetFocus(frmP, noFocus);
FrmSetFocus(frmP, FrmGetObjectIndex(frmP, MainRadioOnButton));
FrmDrawForm(frmP);
handled = true;
break;
case menuEvent:
return MainFormDoCommand(eventP->data.menu.itemID);
case frmCloseEvent:
MainFormDeinit( );
handled = true;
break;
case keyDownEvent:
if (eventP->data.keyDown.keyCode == vchrRockerCenter)
handled = ProcessEvent(eventP);
break;
case ctlSelectEvent:
handled = ProcessEvent(eventP);
break;
default:
break;
}
return ( handled );
}
#if 0
#pragma mark -
#endif
/**
* @brief AppHandleEvent
* Main application event handler.
*
*
* @param *const eventP: IN: Pointer to an event.
* @retval boolean: True if event was handled.
*
*
* @version This function was added in version 1.0
*
**/
Boolean AppHandleEvent( const EventType *const eventP )
{
UInt16 formId = 0;
FormType *frmP = (FormType *)NULL;
if (eventP->eType == frmLoadEvent)
{
formId = eventP->data.frmLoad.formID;
frmP = FrmInitForm( formId );
FrmSetActiveForm( frmP );
switch (formId)
{
case MainForm:
FrmSetEventHandler( frmP, MainFormHandleEvent );
break;
default:
break;
}
return ( true );
}
return ( false );
}
/**
* @brief PrvFunctionPrintMessage
* Prints a message for the user.
*
*
* @param *stringOneP : IN: Pointer to the first string of the message.
* @param *stringTwoP : IN: Pointer to the second string of the message.
* @param *stringThreeP : IN: Pointer to the third string of the message.
* @retval void: No value returned.
*
*
* @version This function was added in version 1.0
*
**/
static void PrvFunctionPrintMessage( Char *stringOneP,
Char *stringTwoP,
Char *stringThreeP )
{
#ifndef TUNGSTEN_W_SCREEN
Err error = errNone;
#ifdef TUNGSTEN_W_DATABASE
DmOpenRef database;
MemHandle h;
DBRecordType r; // this is our database record
UInt16 index = dmMaxRecordIndex;
#else
FileHand file;
#endif
#endif
#ifdef TUNGSTEN_W_SCREEN
FrmCustomAlert( RomIncompatibleAlert, stringOneP, stringTwoP, stringThreeP );
#else
#ifdef TUNGSTEN_W_DATABASE
database = DmOpenDatabaseByTypeCreator( 'logt',
sysFileTApplication,
dmModeReadWrite );
if ( !database )
{
// Tell the user that we're creating a new DB
error = DmCreateDatabase( 0,
"Tungsten W Log",
sysFileTApplication,
'logt',
false );
if ( !error )
{
database = DmOpenDatabaseByTypeCreator( 'logt',
sysFileTApplication,
dmModeReadWrite );
if ( !database )
{
error = DmGetLastErr( );
}
}
}
if ( database )
{
h = DmNewRecord( database, &index, sizeof( r ) );
// fill the record with data
StrCopy( r.String, stringOneP );
StrCat( r.String, " , " );
StrCat( r.String, stringTwoP );
StrCat( r.String, " , " );
StrCat( r.String, stringThreeP );
StrCat( r.String, " " );
if ( h )
{ // could fail due to insufficient memory!
MemPtr p = MemHandleLock( h );
Err err = DmWrite( p, 0, &r,
StrLen( stringOneP ) +
StrLen( " , " ) * 2 +
StrLen( stringTwoP ) +
StrLen( stringThreeP ) +
StrLen( " " ) );
MemPtrUnlock( p );
DmReleaseRecord( database, index, true);
}
}
if ( database )
DmCloseDatabase( database );
#else
file = FileOpen( 0, "Tungsten_W_Log.csv", sysFileTFileStream, 0, fileModeAppend, &error );
if ( error != errNone )
{
FrmCustomAlert( RomIncompatibleAlert, "Error opening Tungsten_W_Log.csv", " ", " " );
return;
}
FileWrite( file, stringOneP, StrLen( stringOneP ), 1, &error );
FileWrite( file, " , ", StrLen( " , " ), 1, &error );
FileWrite( file, stringTwoP, StrLen( stringTwoP ), 1, &error );
FileWrite( file, " , ", StrLen( " , " ), 1, &error );
FileWrite( file, stringThreeP, StrLen( stringThreeP ), 1, &error );
FileWrite( file, "\r\n", StrLen( "\r\n" ), 1, &error );
FileClose( file );
#endif
#endif
}
/* EOF *******************************************************************************************/