quinta-feira, março 26, 2009

Tamanho das janelas no MIDP1 e MIDP2

Na empresa que trabalho nós fizemos um software que deveria rodar em celulares. Havia duas restrições:

- uma delas é que o código deveria rodar em celulares com MIDP1 e MIDP2. A outra é que o código deveria ser único para ambas as especificações.

No desenvolvimento do programa nós usamos Canvas para criar as nossas próprias telas, pois isso nos dá mais flexibilidade quanto ao layout do aplicativo.

Para que os componentes sempre sejam desenhados proporcionalmente ao tamanho da tela do celular (que varia muito de modelo para modelo), nós usamos duas funções da API para obtermos a largura e a altura da tela: getWidth() e GetHeight().

Ok. Testamos em vários aparelhos e nos aparelhos MIDP1 o aplicativo gerava a exceção

No such method getWidth() (e pode gerar, dependendo de quem é chamado primeiro, o erro No such method getHeight()) e morria: Os métodos getWidth() e getHeight() não existiam.

Como não? Estes métodos estão nas duas especificações. Fui examinar as APIs e descobri que, apesar de existirem, elas ficavam em hierarquias diferentes, dependendo da especificação.
java.lang.Object
extended by javax.microedition.lcdui.Displayable
extended by javax.microedition.lcdui.Canvas
Figura 1 - Hierarquia das classes Displayable e Canvas

No MIDP1, os métodos estão na classe Canvas e no MIDP2 estão em em Displayable.

Quando compilas usando as bibliotecas do MIDP2, o compilador automaticamente chama os métodos getWidth() e getHeight() de Displayable. Daí, ao rodarmos o aplicativo no celular com MIDP1, a JVM procura pelos métodos em Canvas, não os encontra e o aplicativo morre.

Agora a dúvida: como resolver isso?

Nossa classe base de desenho de telas (herda de Canvas) chama-se FormBase. Nela nós criamos os métodos


public int getWidth() {
return super.getWidth();
}

public int getHeight() {
return super.getWidth();
}
Isso obriga o compilador a chamar o método Canvas.getWidth() e Canvas.getHeight().

E como isto resolve o problema?

Quando estiver executando o aplicativo em um celular MIDP1, Canvas possui os métodos acima. Quando o aplicativo estiver executando em um celular MIDP2, Canvas não os possuirá. Aí serão chamados os métodos públicos herdados de Displayable.

Voilà! Resolvido o nosso problema de compatibilidade.

A hierarquia de classes do nosso programa é o mostrada na figura 2.

Eu recomendo que tu leias pelo menos um destes dois livros:
Espero que ajude.

Figura 2 - Hierarquia do programa para rodar em MIDP1 e MIDP2

quarta-feira, março 25, 2009

Como gerar Diagramas de Bode sem fazer contas no MATLAB.

Suponha que você precise gerar os Diagramas de Bode para uma função qualquer. Traça-los na mão é muito trabalhoso, chato e sujeito a erros. Existe um modo mais fácil de fazer isso?

Claro que existe. Tu podes usar o Matlab. O Matlab possui algumas funções que traçam os diagramas de margem e fase. Tu só tens que fornecer a função de transferência.

Por exemplo, se a tua função de transferência for

tu podes usar a função Margin(), igual mostrado na figura 1 abaixo.

Figura 1 - Executando a função Margin

O Matlab vai gerar o gráfico mostrado na figura 2.

Figura 2 - Resultado da função Margin

Legal, não é? Mas e se a função de transferência for mais complexa? Se ela for composta por duas ou mais funções? Por exemplo a mostrada na figura 3?

Figura 3 - Função mais complexa para a qual se deseja traçar o Diagrama de Bode

Simples. Tu podes achar a função equivalente, conforme mostrado na figura 4. Daí nós simplesmente chamamos a função Margin passando a função equivalente, igual fizemos no primeiro exemplo.

Figura 4 - Função equivalente para a qual se deseja traçar o Diagrama de Bode

E se a função for mais complexa ainda. Por exemplo, igual a mostrada na figura 5?

Figura 5 - Exemplo de função mais complexa

Simples. Podemos achar a função equivalente dela, igual fizemos no exemplo anterior.

O problema com essa abordagem é que, além de trabalhosa, demorada e sujeita a erros, nem sempre é viável acharmos a função equivalente "na unha".

Devemos deixar o Matlab trabalhar para nós. Como? Simples (irritante esse negócio de ficar falando simples toda hora, não é?). Usaremos a ferramenta do Matlab chamada Simulink.

Os passos são sempre os mesmos, não importa a complexidade do circuito.

Suponha que queremos traçar o Diagrama de Bode para o circuito mostrado na figura 5.

  1. No command Window do Matlab, digite Simulink e tecle ENTER.

  2. Desenhar o circuito / planta para o qual se deseja traçar o Diagrama de Bode (conforme fizemos na figura 5).

  3. Clique com o botão direito do mouse sobre a entrada do sistema e selecione Linearization Points -> Input Point.

    Figura 6 - Selecionando o ponto de entrada do circuito

    Aparecerá uma bolinha com uma setinha entrando nela em cima da linha de entrada do sistema. A figura 7 mostra o que estou falando.

    Figura 7 - Seta vermelha mostra a entrada selecionada

  4. Clique com o botão direito do mouse sobre a saída do sistema e selecione Linearization Points -> Output Point.

    Figura 8 - Selecionando o ponto de saída do circuito

    Aparecerá uma bolinha com uma setinha saindo dela em cima da linha de saída do sistema. Veja a figura 9.

    Figura 9 - Seta vermelha mostra a saída selecionada

  5. Selecione Tools -> Control Design - Linear Analysis (veja a figura 10).

    Figura 10 - Selecionando a análise linear.

  6. Na janela que abrirá, selecione Bode Response Plot no combo box (figura 11).

    Figura 11 - Selecionada a análise Bode Response Plot

  7. Clique no botão Linearize Mode (figura 12).

    Figura 12 - Selecionar o botão de execução da análise linear.
Pronto. O Matlab irá gerar o Diagrama de Bode para ti. A figura 13 mostra o resultado.

A partir de agora, tu nunca mais vais precisar resolver na mão as equações. Este método é útil para outros tipos de análise, como o Diagrama de Nyquist, por exemplo.

O Matlab é uma excelente ferramenta. E, como toda ferramenta, para que possamos aproveitá-la ao máximo, devemos conhecê-la bem.

Recomendo os três livros a seguir:
Não se impressione com as palavras Engenheiros / Engenharia nos títulos. Tu não precisas ser nem engenheiro nem estudante de engenharia para usá-lo.

Tudo que eles ensinam servem para todos que precisem usar o Matlab. Escolha quantos quiser, compre-os e estude-os com afinco. Valerá a pena.

Figura 13 - Diagramas de Bode de Margem e Fase