Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 21:26, 26 October 2007.

Opções de comunicação entre máquina Open C e S60 UI

From Forum Nokia Wiki


Original: Communication options between Open C engine and S60 UI

Contents

Introdução

Este artigo examina as diferente maneiras de combinar as funcionalidade Open C com uma aplicação S60. Dependendo da quantidade de funcionalidade e dos tipos de dados pode-se escolher incluir o código Open C diretamente na aplicação S60 ou criar um novo binário. O binário Open C pode ser um executável separado que executa como um processo independente ou uma biblioteca que é usada pela aplicação S60.

Funcionalidade Open C em um processo separado

Dependendo do tipo da funcionalidade que o componente Open C prove, existem diversas formas de projetar a comunicação (IPC) entre os processos.

// Constantes usadas nos examplos
 
_LIT(KNoName, "");
_LIT(KTxtPanic,"Panic");
_LIT(KEngineName, “MyEngine.exe”);
 
#define KQueueIndex 	10
#define KChunkIndex 	11
#define KMutexIndex	12
#define KMemSize	1024

1) Inicie o processo e espere até o término

/**
 * Aplicação S60 UI
 */
void CMyClass.CallEngineL(const TDesC &aCommandLine)
    {
    TRequestStatus status;
    RProcess process;
 
    User::LeaveIfError(process.Create(KEngineName, aCommandLine));
    process.Logon(status);
    process.Resume();
 
    User::WaitForRequest(status); // espera até que o processo termine
    process.Close();
    }
/**
 * Máquina Open C
 */
int main(int argc, char* argv[])
    {
    // CÓDIGO DA MÁQUINA
    }

2) Troque informações entre os processos que estão executando

Se existir um fluxo contínuo de dados entre os processos um canal deve ser criado. Para tratar o canal de comunicação um camada de código Symbian é adicionado no topo do código Open C. A função main() é substituída pela função E32Main().

/**
 * Novo ponto de entrada
 */
LOCAL_C void OpenCMainL(TPtrC &aCommandLine)
    {
    // ENGINE CODE 
    }
/**
 * Um executável Symbian OS normal prove uma função E32Main() que é chamada
 * pelo sistema operacional para iniciar o programa.
 */
GLDEF_C TInt E32Main()
    {
    CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
	
    // executa o código
    RProcess process;
    TRAPD(error,OpenCMainL(process.CommandLine())); 
 
    __ASSERT_ALWAYS(!error,User::Panic(KTxtPanic, error));
 
    delete cleanup; 	                       // destroi pilha de limpeza
    return 0; 						    
    }

2.1) Usando a fila de mensagens

Código da aplicação S60

// Dados do membros
	RProcess iProcess;	
	RMsgQueue<TInt32> iQueue;
// Initialização
	User::LeaveIfError(iQueue.CreateGlobal(KNoName, 1);
	User::LeaveIfError(iProcess.Create(KEngineName, aCommandLine));
 
	iProcess.SetParameter(KQueueIndex, iQueue);
	iProcess.Resume();
// Engine update
	TInt32 msg;
	iQueue.ReceiveBlocking(msg);
// Finalização
	iProcess.Kill(KErrNone);
	iQueue.Close();
	iProcess.Close();

Código Open C

#include <e32std.h>
#include <e32base.h>
#include <e32cons.h>
#include <e32msgqueue.h> 
 
LOCAL_C void OpenCMainL(TPtrC &aCommandLine)
   {
   RMsgQueue<TInt32> queue;
   User::LeaveIfError(queue.Open(KQueueIndex)); 
 
    while ( ... )
        {
        ...
        // Atualizar processo S60 UI
        TInt32 msg;
        queue.SendBlocking(msg);		
        }
    queue.Close();
    }

2.2) Usando memória global

Código da aplicação S60 UI

// Data members 
    RProcess iProcess;
    RChunk iChunk;
    RMutex iMutex;
// Initialization
    User::LeaveIfError(iChunk.CreateGlobal(KNoName, KMemSize, KMemSize));
    User::LeaveIfError(iMutex.CreateGlobal(KNoName));
    User::LeaveIfError(iProcess.Create(KEngineName, aCommandLine));
 
    iProcess.SetParameter(KChunkIndex, iChunk);
    iProcess.SetParameter(KMutexIndex, iMutex);
 
    iProcess.Resume();
// Engine update
    iMutex.Wait();
    unsigned char* ptr = iChunk.Base(); // Get global memory base address
    ...
    iMutex.Signal();
// Finalization
    iProcess.Kill(KErrNone);
    iMutex.Close();
    iChunk.Close();
    iProcess.Close();

Código Open C

#include <e32std.h>
#include <e32base.h>
#include <e32cons.h>
 
LOCAL_C void OpenCMainL(TPtrC &aCommandLine)
    {
    RChunk chunk;
    RMutex mutex;
 
    User::LeaveIfError(chunk.Open(KChunkIndex)); 
    User::LeaveIfError(mutex.Open(KMutexIndex)); 
 
    while ( ... )
        {
        ...
        // Update UI process
        mutex.Wait();
        unsigned char* ptr = chunk.Base(); // Get global memory base address
	...
        mutex.Signal();
        }
    chunk.Close();
    mutex.Close();
    }

Funcionalidade Open C em uma biblioteca

Funcionalidade Open C dentro do binário da aplicação

Related Discussions
Thread Thread Starter Forum Replies Last Post
open c and nokia 6600 esses Open C 1 2008-02-21 08:09
using a Open C compiled library from python petermor Open C 1 2007-06-19 11:48
What is the simplest way to get the icon on the phone? statoy General Discussion 5 2008-06-25 04:22
S60 Signing and Certification Nokia Ron Symbian Signing, Certification and Security 52 2007-11-15 09:40
n6030 Audun Holme Open C 6 2007-04-30 15:01
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX