Tutorial de Computação Introdução a Programação Gráfica em Java para MEC1100 v2010.10 Linha de Equipamentos MEC Desenvolvidos por: Maxwell Bohr Instrumentação Eletrônica Ltda. Rua Porto Alegre, 212 Londrina PR Brasil http://www.maxwellbohr.com.br
1 Introdução Nesse tutorial vamos criar um projeto que possa ser utilizado como base para outros programas de controle do MEC1100. Vamos aproveitar esse projeto para mostrar passo a passo o que é necessário para criar um programa de controle para o equipamento. No final teremos um programa que permite a seleção da porta USB que será utilizada para se comunicar com o dispositivo, identificação automática da presença de um dispositivo na porta selecionada e todo o suporte para o envio de comandos de controle para o dispositivo, o que facilitará muito o desenvolvimento de outros programas, pois esse poderá ser utilizado como base. 2 Material Para esse tutorial é necessário um MEC1100 conectado em uma porta USB do computador, também será necessário o NetBeans 6.9 ou superior para a criação dos programas e a biblioteca RXTX para fazer a comunicação serial com o MEC1100. Figura 1: MEC1100 3 Projeto O nosso primeiro passo será instalar os programas necessários. Para isso, siga os passos contidos no tutorial_java_mec1100 no topico do tópico Instalação e Configuração do Ambiente de Desenvolvimento Java. Feito isto, iremos criar um projeto no NetBeans 6.9 que possa utilizar a biblioteca de controle do MEC1100 e o RXTX. Para isso, vamos abrir o NetBeans 6.9 e criar um novo projeto. Na versão em português do NetBeans, devemos clicar na opção de menu Arquivo / Novo Projeto, escolha Aplicativo de área de trabalho java, coloque o nome do Projeto como Base, escolha um lugar para salvar o projeto e clique em Finalizar e com isso será criado um novo Projeto. 1
Com o projeto criado, devemos agora fazer com que ele possa utilizar a biblioteca de controle do dispositivo e o RXTX. Existe algumas maneiras diferentes para permitir esse uso, no entanto, usaremos a forma mais fácil, que é copiar os arquivos MEC1100.java e o EMEC1100Error.java para dentro de nossa pasta src do projeto. Para adicionar a biblioteca do RXTX devemos clicar em Bibliotecas no menu Projetos dentro do NetBeans e ir em Adicionar jar/pasta e adicionar o RXTXcomm.jar. Com isso feito a aparência da nossa pasta src deverá se parecer com o seguinte: Figura 2: Pasta "src" do projeto E a aparência do nosso projeto no NetBeans deverá se parecer com o seguinte: Figura 3: Aparência do projeto no NetBeans Com os arquivos copiados, devemos alterar o pacote do EMEC1100Error.java e Mec1100.java. Para isso, abra-os e, onde está escrito package, mude para o nome do projeto. No nosso caso mude para base. Dentro do arquivo Baseview.java temos duas opções: ver o código fonte clicando em Código-fonte ou ver o projeto gráfico clicando em Projeto. Agora iremos criar a interface gráfica. Essa interface deve permitir a seleção da porta USB onde o dispositivo está conectado e indicar se a comunicação está correta. Para isso criaremos a interface demonstrada na figura a seguir: 2
Figura 4: Programa pronto. Essa interface possui apenas componentes gráficos básicos. Um componente jcombobox que permite a seleção da porta USB, um componente jpanel e um jlabel, que indica o estado da conexão. Iremos criar essa interface passo a passo. Primeiramente vamos incluir um componente jcombobox. Esse componente pode ser encontrado na Paleta / Componente Swing / Caixa de combinação. Figura 5: Componente jcombobox 3
Selecione o componente Caixa de combinação e clique dentro do painel do projeto para adicionar o jcombobox. Após adicionar o jcombobox nosso BaseView terá a seguinte aparência: Figura 6: Adição de um jcombobox Vamos mudar a seguintes propriedade desse componente em Propriedades: Tamanho Horizontal = 100 Agora, vamos mudar o nome da variável que acessa o jcombobox clicando com o botão direito sobre o mesmo e, em Change Variable Name, vamos colocar comboboxserial Com o comboboxserial configurado vamos adicionar dois componentes que irão indicar o estado da conexão, um jlabel e um jpanel. Os dois componentes podem ser encontrados na Paleta. A seguir uma imagem do BaseView após a adição dos componentes ao Painel superior: Figura 7: Adição de um JLabel e um jpanel Vamos mudar as seguintes propriedades do componente jpanel, selecionando-o e modificando as seguintes propriedades : backgroud = [0,255,0] Tamanho vertical = 25 Tamanho horizontal = 25 4
Vamos mudar também o nome da variável que acessa este jpanel clicando com o botão direito sobre ele e em Change Variable Name vamos colocar LEDStatus No componente jlabel iremos mudar as seguintes configurações: text = Desconectado foreground = Vermelho font = 14 / Negrito Vamos mudar também o nome da variável que acessa o jlabel clicando com o botão direito sobre o mesmo e em Change Variable Name vamos colocar labelstatus Ao final nossa barra superior irá se parecer com o seguinte: Figura 8: Aparência final da parte superior do programa. Agora que temos a parte visual do programa vamos implementar suas funcionalidades. Primeiramente vamos implementar as rotinas de inicialização e finalização do programa. Para isto mude para o modo Código-fonte e abaixo da public class BaseView crie um objeto do tipo MEC1100 conforme a figura a seguir: Figura 9: Criando um objeto do tipo MEC1100 5
Com isto feito, voltamos a aba Projeto e vamos adicionar o comando listar as portas seriais no comboboxserial. Para isto clique com o botão direito no comboboxserial e vá em personalizar código e, em seguida, adicione o seguinte código: Vector<String>portas=base.MEC1100.GetInstalledSerialPorts(); comboboxserial = new javax.swing.jcombobox(); //Listas portas disponíveis no comobboxserial for (String x : portas) { comboboxserial.additem(x); } A janela de personalização do código deverá se parecer com o seguinte: Figura 10: Janela de personalização do comoboboxserial. Antes de enviar um comando de controle para o MEC1100 é necessário iniciar a comunicação em uma porta USB. Isso é feito com o método OpenCommunication da classe de controle do MEC1100. Esse método recebe como parâmetro uma String, com uma porta USB, onde o dispositivo que será controlado deve estar. Vamos fazer com que, assim que seja selecionado algo no comboboxserial, o programa tente iniciar uma comunicação com o MEC1100. Para isto clique como o botão direito no comboboxserial e vá em Eventos/Popup/PopupMenuWillBecameInvisible e, então você será direcionado para o código fonte onde deverá inserir o seguinte código: 6
try{ //Inicia a comunicação com a porta selecionada na combobox mec.opencommunication((string) comboboxserial.getselecteditem()); if(mec.isconnected()){ //Muda a cor do texto para verde labelstatus.setforeground(new java.awt.color(50, 205, 50)); // muda o texto adicionando as informaçoes do MEC1100 labelstaus.settext("conectado a um "+mec.deviceinfo()); }else{ //Muda a cor para vermelho labelstatus.setforeground(new java.awt.color(255, 0, 0)); //muda o texto para desconectado labelstaus.settext("desconectado"); }}catch (Exception err){ System.out.println("Erro:" + err.getmessage()); } Esse código irá iniciar a comunicação, caso possível, e atualizará a jlabel com as informações do MEC1100 e mudará a cor para verde se o mesmo estiver conectado. Nesse momento, podemos testar nosso programa. O mesmo deverá listar todas a portas seriais/usb instaladas no sistema operacional. Para testar pressione F6. O programa deverá estar semelhante a figura a seguir: Para verificar continuamente a presença de algum dispositivo, iremos utilizar um método chamado actionperformed. Esse método executa um código em intervalos pré-determinados de acordo com o timer que criaremos a seguir. 7
Então, iremos no editor de código para realizarmos uma modificação. A classe deve implementar o ActionListener. Para isto, logo após public class BaseView extends FrameView que se localiza no inicio do código, adicionaremos implements ActionListener. Deverá ficar igual ao código a seguir: public class BaseView extends FrameView implements ActionListener{ Agora vamos declarar uma variável do tipo Timer. Para isso, abaixo do local onde criamos o objeto do MEC1100, insira o código a seguir: Timer timer Feito isso, vamos criar o actionperformed. Para isto após o último método insira o seguinte código: public void actionperformed(actionevent e) { try{ mec.opencommunication((string) comboboxserial.getselecteditem()); if(mec.isconnected()){ labelstatus.setforeground(new java.awt.color(50, 205, 50)); labelstatus.settext("conectado a um "+mec.deviceinfo() ); }else{ labelstatus.setforeground(new java.awt.color(255, 0, 0)); labelstatus.settext("desconectado"); } }catch (Exception err){ System.out.println("Erro:" + err.getmessage()); } } Agora, iremos fazer esse código ser acionado a cada 100 ms. Para isso vá no método public BaseView no incio do código e adicione o seguinte código, abaixo da linha initcomponents(); : new Timer(100,this).start(); 8
A seguir uma imagem com o programa final e com os dois estados da conexão. No primeiro, a aparência sem conexão e, no segundo, com conexão. Para finalizar o projeto iremos mudar o nome do programa indo na aba Projetos e clicando com o botão direito sobre o nome do projeto e, em seguida, em Propriedades. Na tela que foi aberta, escolha no menu Categoria, a opção Apllication. Neste, vamos alterar o titulo para Base. Figura 13: Mudando o nome do programa. Dê OK e teste seu programa. 4 Conclusão Nesse tutorial vimos como criar um programa base para controlar o MEC1100. A partir do programa criado nesse tutorial podem ser criados outros programas com maior facilidade, pois toda a estrutura de base já está implementada. Todos os outros tutoriais vão utilizar o programa criado nesse tutorial como base. Se esse tutorial for bem entendido não haverá problemas para o entendimento dos outros tutoriais e da programação para o dispositivo. 9