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