Visualizar - Polis Educacional
Transcrição
Visualizar - Polis Educacional
Leonardo Torati RA: 0205022 – 8º SEM INTERFACE PARA CONTROLE DE MOVIMENTOS DE UM ROBÔ TIPO ARANHA COM QUATRO PATAS (AR+) Jaguariúna 2005 1 Leonardo Torati RA: 0205022 – 8º SEM SISTEMA DE CONTROLE DO ROBÔ AR+ INTERFACE PARA CONTROLE DE MOVIMENTOS DE UM ROBÔ TIPO ARANHA COM QUATRO PATAS (AR+) Monografia apresentada à disciplina Trabalho de Conclusão de Curso, do Curso de Ciência da Computação da Faculdade de Jaguariúna, sob a orientação do Prof. André Mendeleck, como exigência parcial para conclusão do curso de graduação. Jaguariúna 2005 2 TORATI, Leonardo. Interface para controle de movimentos de um robô tipo aranha com quatro patas. Monografia defendida e aprovada na Faculdade de Jaguariúna – FAJ no dia 16.DEZ.05 pela banca avaliadora: __________________________________________________________________________ Prof. André Mendeleck Orientador – Faj __________________________________________________________________________ Prof. Presidente da Banca Avaliadora __________________________________________________________________________ Prof. Convidado 3 AGRADECIMENTOS Gostaria de agradecer a todas as pessoas que, de alguma forma, colaboraram para a realização desta Monografia. Em particular, gostaria de agradecer: ao Prof. André Mendeleck, orientador do trabalho, por acreditar na minha capacidade de realização e por compartilhar um pouco do seu conhecimento comigo, orientando sabiamente os meus passos para a realização desta Monografia. aos Professor Paulo por ensinar a essência da criação de uma monografia e aos professores Peter e Silvio, por me ajudarem no desenvolvimento das técnicas de programação empregadas no desenvolvimento do software de controle do robô tipo aranha. 4 RESUMO Face às exigências por qualidade e produtividade, cada vez mais está se automatizando os processos produtivos. Por exemplo, tornos com controle numérico, robôs de montagem e soldagem, permitem a uniformização da qualidade e flexibilizam a linha da produção. Por outro lado, robôs são utilizados para explorar lugares onde, por enquanto, o homem ainda não pode ir, como o fundo do oceano ou os planetas "próximos" da Terra. Para isso, esses robôs precisam movimentar-se de forma autônoma, geralmente sob a supervisão de um sistema computadorizado que está embarcado no mecanismo, contudo, algumas aplicações necessitam de intenso processamento que é realizado externamente. Assim, deve-se estabelecer um meio de comunicação. Existem vários meios de realizar a comunicação do robô com o computador. A comunicação através da porta serial é um exemplo de comunicação utilizado e o robô precisa ser capaz de interpretar os comandos enviados pelo computador. Para o robô tipo aranha com quatro patas (AR+) desenvolvido neste projeto, são utilizados servo-motores para permitir o movimento das patas e o sistema desenvolvido (ARc) para controlar o robô permite a criação de seqüências de movimentos. As seqüências criadas pelo sistema ARc podem ser salvas e reutilizadas. O sistema foi desenvolvido na linguagem Java e utiliza o banco de dados Firebird para armazenar as seqüências de movimentos. Palavras-chave: ROBÓTICA, ROBÔ ARANHA, SERVO-MOTOR. 5 ABSTRACT In this work we developed a system and a Man Machine Interface to control the moviments of a four legs mobile robot called spider robot. The system can move the robot front, back, left and right sides. The robot has four legs with two articulations each. The actuators are servo-motors with position control. The system was developed using JAVA language and FIREBIRD data base system. 6 Sumário 1. INTRODUÇÃO................................................................................................................ 08 1.1. Robótica....................................................................................................................... 08 1.2. Robótica Móvel ............................................................................................................ 10 2. METODOLOGIA ............................................................................................................. 13 3. O ROBÔ ......................................................................................................................... 14 3.1. Projeto: Interface para controle de movimento de um robô aranha de quatro patas .. 14 3.2. Componentes utilizados .............................................................................................. 14 3.3. Estrutura ...................................................................................................................... 17 3.4. Movimentos ................................................................................................................. 19 3.5. Sistema de controle ..................................................................................................... 21 4. “AR” – ROBÔ ARANHA DE QUATRO PATAS............................................................... 26 4.1. Movimento ................................................................................................................... 27 4.2. Projeto ......................................................................................................................... 28 5. DIVISÃO DO SISTEMA “ARc”........................................................................................ 29 5.1. Classes de informação (Módulos de informação) ....................................................... 29 6. NÍVEL BAIXO ................................................................................................................. 33 6.1. Relação entre os módulos do nível Baixo ................................................................... 37 7. NÍVEL ALTO ................................................................................................................... 38 7.1. Módulos de controle .................................................................................................... 38 7.2. Módulos de interação .................................................................................................. 41 7.3. Relação entre os módulos do nível Alto ...................................................................... 46 8. NÚCLEO......................................................................................................................... 47 9. BANCO DE DADOS ....................................................................................................... 49 9.1. Tabelas ........................................................................................................................ 49 10. TRAJETÓRIA DE UM COMANDO ............................................................................... 53 10.1. Trajetória do comando na visão do operador ............................................................ 53 10.2. Trajetória do comando na visão do sistema .............................................................. 54 11. CONCLUSÃO ............................................................................................................... 57 Bibliografia ........................................................................................................................... 58 ANEXO 1 – Código Fonte do Sistema ARc 7 Lista de Ilustrações Figura 1 – Servo-Motor......................................................................................................14 Figura 2 – Placa Servo-Controladora SB Servo-Control ...................................................15 Figura 3 – Conector do Servo-Motor .................................................................................15 Figura 4 – Pulsos para o servo-motor ...............................................................................16 Figura 5 – Estrutura Básica ...............................................................................................18 Figura 6 – Disposição dos componentes...........................................................................18 Figura 7 – Articulações das patas .....................................................................................19 Figura 8 – Pata estendida na direção contrária à base .....................................................20 Figura 9 – Pata estendida na direção da base ..................................................................20 Figura 10 – Movimento para o sentido oposto à base.......................................................21 Figura 11 – Sistema de controle........................................................................................21 Figura 12 – IHM .................................................................................................................23 Figura 13 – Seqüências NPA e NSAs ...............................................................................24 Figura 14 – NPA e NSAs ...................................................................................................24 Figura 15 – ICM .................................................................................................................25 Figura 16 – Identificação das patas e motores..................................................................26 Tabela 1 – Posição dos motores nas patas.......................................................................26 Tabela 2 – Comando .........................................................................................................31 Figura 17 – Escalonador....................................................................................................35 Figura 18 – Relação entre os módulos do nível Baixo ......................................................37 Figura 19 – Árvore do Desmontador NSA .........................................................................39 Figura 20 – Loop na execução de um NSA.......................................................................40 Figura 21 – Tela Principal..................................................................................................41 Figura 22 – Tela de Edição NPA .......................................................................................42 Figura 23 – Tela de Edição NSA .......................................................................................44 Figura 24 – Tela de Configuração .....................................................................................45 Figura 25 – Relação entre os módulos do nível Alto .........................................................46 Figura 26 – Relação entre os módulos através do Núcleo................................................48 Tabela 3 – Comando .........................................................................................................50 Tabela 4 – Exemplo de comando armazenado .................................................................50 Tabela 5 – Exemplo tabela NSA........................................................................................51 Tabela 6 – Exemplo tabela NSA Lista ...............................................................................51 8 1. INTRODUÇÃO A automação de processos, equipamentos e manufaturas atinge as mais variadas áreas do contexto sócio-econômico e do nosso cotidiano. Como ator principal, o computador e seus agregados de hardware e software tem facilitado a implementação de processos produtivos e melhorado a qualidade de vida. Assim, novas tecnologias e novos equipamentos surgem para facilitar ou, até mesmo, automatizar determinadas tarefas rotineira. Por exemplo, pequenos robôs são utilizados para explorar lugares onde, por enquanto, o homem ainda não pode ir, como o fundo do oceano, outros planetas, ou realizando atividades "domésticas" de limpeza. Como características principais, esses elementos robóticos devem ser autônomos e Ter capacidade de auto-aprendizado. 1.1 Robótica A busca de qualidade total no processo produtivo e manufatura fazem surgir uma crescente demanda de tarefas com eficiência, eficácia e precisão. Existem também tarefas a serem realizadas em lugares onde a presença humana se torna difícil, arriscada e até mesmo impossível, como o fundo do mar ou a imensidão do espaço. Para realizar essas tarefas, se faz cada vez mais necessária a presença de dispositivos (robôs), que realizam essas tarefas sem risco de vida. A robótica é a área que se preocupa com o desenvolvimento de tais dispositivos. A Robótica é uma área multidisciplinar que busca o desenvolvimento e a integração de técnicas e algoritmos para a criação de robôs. A robótica integra contextos comuns às áreas de engenharia mecânica, engenharia elétrica, inteligência artificial, entre outras, que se faz necessária para se projetar essas maravilhosas tecnologias. [CAEIRO; SERRA; JORGE, O primeiro grande..., 19.JUN.05] Os robôs permeiam as mais variadas áreas de nossa sociedade: robôs que prestam serviços, como os desarmadores de bomba, robôs com a nobre finalidade da pesquisa científica e educacional, robôs médicos, robôs de manipulação e até mesmo os robôs operários, que se instalaram em nossas fábricas e foram responsáveis pela "segunda 9 Revolução Industrial", revolucionando a produção em série e fornecendo maior qualidade aos produtos. Uma dos maiores sonhos do homem é construir uma máquina com "Inteligência Artificial" capaz de agir e pensar como ele. No entanto, este desejo esconde em seu subconsciente a vontade de possuir um "escravo metálico" que satisfaça todos os seus desejos. "Este sonho humano está perto de se tornar realidade com o espantoso avanço da tecnologia computável". [LIMA, Home Page. 10.ABR.05] A palavra robô tem origem da palavra tcheca robotnik, que significa servo, o termo robô foi utilizado inicialmente por Karel Capek em 1923, nesta época a idéia de um "homem mecânico" parecia vir de alguma obra de ficção. Não é só do homem moderno o desejo de construir tais robôs, existem alguns fatos históricos que nos mostram que a idéia não é nova, por exemplo, existem inúmeras referências sobre o "Homem Mecânico" construído por relojoeiros com a finalidade de se exibir em feiras. [LIMA, Home Page. 10.ABR.05] Temos relatos também da realização de várias "Animações Mecânicas" como o leão animado de Leonardo da Vinci, e seus esforços para fazer máquinas que reproduzissem o vôo das aves. Porém estes dispositivos eram muito limitados, pois não podiam realizar mais que uma tarefa, ou um número reduzido delas. [KLICKEDUCAÇÃO, Quem foram.... 10.OUT.05] A idéia de se criar máquinas que substituíssem o trabalho humano já é bem antiga, sendo datada desde a Grécia antiga com Ctesibus, em 270 A.C, que desenvolveu figuras animadas movidas com a energia da água. O primeiro robô móvel foi o robô Shakey, desenvolvido nos laboratórios do Instituto de Pesquisas de Stanford no ano de 1966. Apesar de ser pioneiro, o robô já possuía muitos dos recursos utilizados atualmente na grande maioria dos robôs: [TOURINO, Sistema de rastreamento..., 22.MAI.05] - Câmera de TV; - Sensor por triangulação laser; - Sensores de colisão por contato; - Conexão via rádio com computadores PDP-10 e PDP-15 (figura ) para controle e vídeo; - Programas para percepção do ambiente, modelagem e ação. 10 Um robô é qualquer dispositivo capaz de executar alguma tarefa normalmente realizada pelo homem, como por exemplo, movimentar peças. [TORATI, Leonardo] A idéia de se construir robôs começou a tomar força no início do século XX com a necessidade de aumentar a produtividade e melhorar a qualidade dos produtos. É nesta época que o robô industrial encontrou suas primeiras aplicações, o pai da robótica industrial foi George Devol. [CAEIRO; SERRA; JORGE, O primeiro grande..., 19.JUN.05] Atualmente devido aos inúmeros recursos que os sistemas de microcomputadores nos oferecem, a robótica atravessa uma época de contínuo crescimento que permitirá, em um curto espaço de tempo, o desenvolvimento de robôs inteligentes fazendo assim a ficção do homem antigo se tornar a realidade do homem atual. Sem dúvida a automação industrial foi, e é um grande impulsionador da tecnologia de robótica. Cada vez mais tem se procurado aperfeiçoar os dispositivos, dotando-os com inteligência para executar as tarefas necessárias. Por exemplo, usando Redes Neurais procura-se a linearização de acionamentos eletromecânicos; com Fuzzy Logic pode-se fazer o planejamento de trajetória para robôs redundantes; ou utilizando Sistemas Especialistas é possível a detecção de problemas e/ou rapidamente encontrar soluções para problemas específicos. 1.2 Robótica Móvel "Um robô móvel é um robô com capacidade de se locomover, ou seja, um sistema que possui auto-propulsão, capacidade de locomoção (re)programável, controle automático ou semi-automático e capacidade de realizar uma determinada tarefa." [TORATI, Leonardo] Existem robôs móveis que atuam em diferentes ambientes como terrestres, aquáticos, subaquáticos, robôs voadores e até mesmo robôs espaciais, como telescópios robotizados ou que atuam em outros planetas, como os robôs exploradores enviados para marte (Opportunity, Sojourner). Existem diversos critérios que classificam os robôs móveis: 11 - Tipo de locomoção o Rodas: como veículos convencionais o Pernas: como insetos Quadrúpedes: quatro patas Hetópodes: seis patas o Hovers: flutuam por meio de fluxo de ar. - Tipo de estrutura (rígida, flexível, única, modular) - Forma geométrica o Simples, como retêngulo, circular o Complexa - multi articulada como as rótulas - Ambiente de funcionamento (terrestre, aquático, sub-aquático, aéreo, espacial, etc.) - Nível de autonomia o Tele operado, com supervisão humana remota o Totalmente autônomo, sem supervisão A aplicabilidade de robôs móveis é muito ampla, principalmente as plataformas móveis intercambiáveis. A seguir apresentamos alguns exemplos: - Alguns exemplos de atividades já executadas por robôs móveis: - Desarmamento de bombas e artefatos perigosos e localização de sobreviventes em áreas de risco: O desarmamento de artefatos explosivos envolve um grande risco de vida e esse tipo de robô tem por função permitir que um especialista perito em explosivos possa desarmar o dispositivo perigoso sem envolver risco de vida. O especialista controla o robô a uma distância segura, através de câmeras ele vê o que o robô vê e utiliza ferramentas instaladas no robô para executar a tarefa de desarmar o artefato explosivo. Esse tipo de robô móvel também é utilizado para procurar por sobreviventes em áreas risco como, por exemplo, entre escombros de desabamentos, locais com gás tóxicos presentes, etc. [SANTUCI CARVALHO, 15.MAI.2005] - Recuperação de turbinas em usinas hidrelétricas: Pesquisadores da Universidade Federal de Santa Catarina (CTC-UFSC) e do Instituto de Tecnologia para o Desenvolvimento (Lactec), de Curitiba (PR), desenvolveram o primeiro robô capaz de recuperar pás das turbinas de usinas hidrelétricas do Brasil. Chamado de 12 Roboturb, projeto foi apresentado nesta semana em Florianópolis. O Roboturb é um robô soldador, que se fixa nas paredes das pás das turbinas por meio de ventosas. Ele possui ainda um trilho, no qual ele consegue mobilidade suficiente para atuar em uma área maior da pá sem precisar se deslocar. [INOVAÇÃO TECNOLÓGICA, Robô brasileiro..., 25.MAI.2005] - Pesquisa submarina: Um pequeno submarino robô chamado Spray é um robô autônomo que atravessou a corrente do Golfo coletando dados científicos. Lançado no dia 11 de Setembro de 2004, cerca de 100 milhas náuticas ao sul da ilha Nantucket, Estados Unidos, o submarino de dois metros de comprimento chegou às Bermudas após viajar por mais de 600 milhas a uma velocidade de cerca de um quilômetro por hora, a uma profundidade de 1.000 metros. Três vezes ao dia o Spray ia até a superfície, sempre coletando dados científicos. [INOVAÇÃO TECNOLÓGICA, Robô submarino..., 25.MAI.2005] Este ano (2005), na Feira Internacional de Ciência e Engenharia da Intel, um aluno português de 18 anos desenvolveu e apresentou um protótipo de uma aranha robô com seis patas. Carlos Arsénio, aluno que desenvolveu o projeto, disse ter utilizado pernas para melhor mobilidade do robô e que, um robô com essa capacidade de mobilidade poderia ser utilizado para várias funções, desde construção civil até desarmamento de bombas. [ANSÉNIO, Um Robot Aranha, 29.SET.05] 13 2. METODOLOGIA Através de pesquisas sobre robôs e robôs móveis será possível entender aspectos básicos sobre o funcionamento, os componentes, os movimentos e o controle desses equipamentos, podendo, assim, realizar novas pesquisas desses aspectos básicos individualmente focando nas necessidades para realização do projeto. Através das informações adquiridas nas pesquisas será possível desenvolver um modelo do robô aranha de quatro patas e aplicar estudos sobre a estrutura, os movimentos, etc. Um elemento fundamental para a operacionalidade do mecanismo é o software gestor de movimentos. Realizamos várias pesquisas para levantar as informações necessárias sobre as características (requisitos) do software, será feito um estudo sobre uma linguagem de programação que permita o desenvolvimento tanto da parte lógica quanto da parte visual do sistema e um banco de dados de fácil utilização. Um protótipo real do robô aranha de quatro patas deverá ser construído para testes práticos do sistema de controle. Será desenvolvida uma interface visual para o sistema de controle, que vai permitir que pessoas operando o computador (operadores) controlem o robô aranha de quatro patas. 14 3. O ROBÔ 3.1 Projeto: Interface para controle de movimento de um robô aranha de quatro patas (AR+) O robô AR+ (aranha robô de quatro patas) é um robô móvel do tipo quadrúpede, servocontrolado e seu controle é feito totalmente por computador pela porta serial através de uma interface gráfica com o operador. O operador (usuário), através de um programa, informa quais movimentos o robô deve executar, o programa gera os comandos necessários para executar tais movimentos e os envia para o robô através da porta serial. Uma placa servo-controladora, situada no centro do robô, recebe os comandos do computador e os interpreta fazendo movimentar oito servomotores, dois em cada uma das quatro patas do robô. 3.2 Componentes utilizados O AR+ possui oito servo-motores e uma placa servo-controladora. Figura 1 - Servo-motor VCC 5V 3A MOTORES PIC 16F628 MAX 232 COMPUTADOR CNEXÃO SERIAL CONTROLE VCC GND 15 PO TÊNCIA Figura 2 – Placa Servo-Controladora SB Servo-Control Os motores possuem três conectores: alimentação de energia, terra e controle. Cada motor precisa de uma tensão de alimentação e sinais no conector de controle entre 4,6 e 6 V. CONTROLE VCC 4.6 a 6 V TERRA (GND) Figura 3 - Conector do Servo-Motor A placa controladora de servo-motores, SB Servo Control da Solbet, é conectada ao computador pela porta serial (RS232-C), por onde recebe os comandos, e tem capacidade de controlar até oito servo-motores. Também possui integrada toda a eletrônica necessária para implementar um sistema capaz de se posicionar em um determinado ângulo, sob o 16 comando de um sinal eletrônico. O controle do servo-motor é realizado através de pulsos de amplitude constante de 5V na sua entrada de controle. Os pulsos de controle devem se repetir a cada 25~30 ms. Se o pulso tiver uma largura de 1,5 ms, o servo ficará na posição central. Com um pulso de 1 ms o servo se deslocará todo para a esquerda, e um pulso de 2 ms provocará desvio do servo para toda a direita. Pulso de 1 ms - Esquerda Pulso de 1,5 ms - Centro Pulso de 2 ms - Direita Figura 4 – Pulsos para o servo-motor Esses pulsos devem ser mantidos durante todo o tempo. A falta dos pulsos irá fazer com que o servo retorne para a posição central. Os servo-motores se movimentam cerca de 180º e recebem como comandos valores inteiros de 1 a 128. Então, para indicar ao motor que deve ser assumido uma rotação de 90º, deve-se enviar o valor 64, ou seja, 180º equivalem a um valor 128, 90º, a 64 e assim por diante. Os comandos enviados para a SB Servo Control, através da porta serial, são compostos por três campos: identificação do servo, deslocamento desejado (ângulo) e terminador (CR). A identificação do servo é dada por letras maiúsculas, na seguinte seqüência: 17 A, servo 1 B, servo 2 até H, servo 8 Exemplos de comandos: A23<CR> B77<CR> H110<CR> Um valor de 65 para o deslocamento corresponde a um pulso de 1,5 ms, o que corresponde a um deslocamento de 0 grau. Valores acima de 65 até 130 provocam deslocamento de até 60 graus no sentido horário e abaixo de 65, geram deslocamento de até 60 graus no sentido anti-horário. Ao ser energizado, o sistema assume a geração de pulsos de 1,5 ms, levando todos os servos à posição de 0 grau. A placa SB Servo Control possui 5 conectores: JP1, JP2, JP3, JP4 e X1. JP1, JP3 e JP4 são utilizados em conjunto. JP1: Tensão de controle dos servos. O servo A corresponde ao pino 1. JP3: Tensão de alimentação dos servos. Pode variar de 4,6 a 6 V. JP4: Terra. JP2: Alimentação DC do sistema. Pode variar de 5 a 6 v. X1: Conector DB-9 RS232-C. Utilizado para interligar o sistema a um microcomputador via interface serial. Alguns problemas podem ocorrer, como trepidação do servo, por exemplo. Isso pode ocorrer se o sistema não estiver devidamente alimentado ou a alimentação de energia não estiver estabilizada. 3.3 Estrutura As estrutura do robô AR+ é feita principalmente de alumínio. A base tem a forma de um ‘+’ (sinal de adição) e as patas são conectadas uma em cada lado da base, como na figura. 18 Patas Base em forma de ‘+’ Figura 5 - Estrutura básica Cada pata tem duas articulações e cada articulação é movimentada por um servo-motor. A placa SB Servo Control fica no centro da base. Os servo-motores estão distribuídos dois em cada pata, um na articulação ligada a base e outro na articulação central da pata. Na extremidade de cada pata há um pé de apoio feito de borracha. MD PÉS DE APOIO MC MB MA INTERFACE CONTROLE SERVO-MOTORES ME MF MG MH Figura 6 - Disposição dos componentes 19 BASE ARTICULAÇÕES Figura 7 - Articulações das patas 3.4 Movimentos O AR+ tem seus movimentos limitados em quatro direções (N, S, L e O), tornando menos complexo e mais confiável sua movimentação. O AR+ não possui sensores, os movimentos são gerados pelo programa de computador que se baseia em informações previamente inseridas, ou seja, o programa entende que certos valores de comandos correspondem a determinados movimentos, mas não são fornecidas informações sobre se os movimentos planejados foram realmente executados. Então, com a limitação das direções de movimentos, os movimentos gerados pelo programa são executados com maior confiabilidade pelo robô. Para se deslocar o AR+ se apóia em duas patas paralelas, estendendo as outras duas patas, uma em direção contrária à base e outra na direção da base. Veja a figura: 20 BASE Figura 8 - Pata estendida na direção contrária à base BASE Figura 9 - Pata estendida na direção da base Após o posicionamento das patas estendidas, as patas de apoio levantam, deixando somente as patas que estão estendidas sustentando a estrutura. Neste momento o robô está pronto para se deslocar. Para isso, as patas que estão sustentando a estrutura se movimentam. Se a pata estiver estendida para a direção da base do robô, ela executa um movimento de forma a assumir a direção contrária à base. Se a pata estiver estendida para a direção contrária à base, faz o movimento na direção da base. 21 BASE Figura 10 - Movimento para o sentido oposto à base Como o robô AR+ tem a forma de um ‘+’ (sinal de adição), todas as quatro patas se movimentam no sentida da base ou oposto à base. O método de movimento apresentado é válido para qualquer uma das quatro direções em que o robô se movimenta. 3.5 Sistema de controle BASE DE DADOS IHM INTERFACE HOMEM / MÁQUINA GERADOR DE TAREFAS MOTOR A MOTOR B MOTOR C MOTOR D SOFTWARE DE CONTROLE SERIAL RS232 INTERFACE DE CONTROLE DOS MOTORES MOTOR E GERADOR DE MOVIMENTOS CONTROLE DOS MOTORES MOTOR H Figura 11 - Sistema de Controle MOTOR G MOTOR F 22 O robô AR+ é totalmente controlado por um software (sistema de controle) instalado em um computador do tipo PC. Esse software se comunica com o robô enviando comandos, formados por caracteres ASCII, através da porta serial utilizando o protocolo RS232-C. O sistema de controle é um software que: gera movimentos, controla movimentos, possui uma interface Homem-Máquina (IHM), armazena movimentos e gera tarefas. Controle dos Motores: Gera a posição de cada motor conforme a posição desejada das patas. As informações do Controle dos Motores são enviadas para o robô. Gerador de Movimentos: Seqüência as posições necessárias dos motores para a geração de movimento. Os movimentos podem ser simples, compostos ou seqüenciais. - Movimento simples: é o movimento executado por um único motor, por exemplo, o movimento do motor C. - Movimento composto: é o movimento executado por mais de um motor de um mesmo conjunto, ou seja, para movimentar uma pata do robô, são necessários movimentos de mais de um motor dessa mesma pata; um conjunto de movimentos simples. - Movimento seqüencial: é uma composição de movimentos compostos que são executados seqüencialmente para executar uma determinada tarefa, como por exemplo, andar para frente, andar para traz, etc. Interface Homem-Máquina (IHM): Realiza a interface do robô com o operador permitindo a implementação funcional das ações a serem realizadas. A IHM permite ao operador: 23 IHM CONTROLE INDIVIDUAL DOS MOTORES CONTROLE INDIVIDUAL DAS PATAS CONTROLE DE MOVIMENTO EM ALTO NÍIVEL GRAVAÇÃO DE MOVIMENTOS Figura 12 – IHM - Controle Individual dos Motores: a posição de cada motor pode ser alterada. - Controle Individual das Patas: Cada pata possui um conjunto de motores que têm suas posições alteradas de acordo com o movimento desejado da pata, ou seja, o operador informa o que a pata deve fazer e a posição dos motores é ajustada pelo sistema. - Controle de Movimento em Alto Nível: O robô possui um conjunto de patas que têm suas posições alteradas de acordo com o movimento do robô, ou seja, o operador informa o que o robô deve fazer e a posição das patas é ajustada pelo sistema. - Gravação de Movimentos: Os movimentos ou seqüências de movimentos realizados podem ser gravados para serem reutilizados em outros movimentos ou seqüências de movimentos. Base de Dados: Armazena seqüências de movimento dos motores. Essas seqüências formam os Conjuntos de Ações (CAs). O conjunto de ações que contém os movimentos básicos do robô e é chamado de Núcleo Primário de Ação (NPA). O NPA é a base para outras seqüências de movimento. Quando novos conjuntos de ações são criados, são chamados de Núcleos Secundários de Ações (NSA) e podem ser criados a partir do NPA ou 24 de outros NSAs. Cada seqüência de um NPA ou NSA possui um identificador (label) e um tempo de espera (delay) além da seqüência de movimentos. Sequencias DELAY LABEL NPA / NSA SEQÜÊNCIA Figura 13 - Seqüências NPA e NSAs Gerador de tarefas: Gera composições de movimentos e ações (NSAs) para executar uma determinada tarefa. Uma vez validada a tarefa, esta é armazenada no Banco de Dados, NSA tornando-se um novo NSA. NSA NPA NSA Figura 14 - NPA e NSAs Interface de Controle dos Motores (ICM): Recebe os comandos do computador e aplica nos motores. VCC 5V 3A MOTORES PIC 16F628 MAX 232 COMPUTADOR CNEXÃO SERIAL CONTROLE VCC GND 25 PO TÊNCIA Figura 15 – ICM TERRA Componentes da ICM: - Conexão serial: Plug DB9 para conexão do fio serial que liga a ICM ao computador. - MAX 232: Chip que faz a interface de comunicação da ICM com o computador utilizando o protocolo RS232. - PIC 16F628: Micro controlador que contém o programa de controle dos servomotores. - Potência: Chip que distribui a energia necessária para cada dispositivo. Os servo-motores são conectados à ICM por meio de 3 fios: VCC, TERRA e CONTRLE, onde VCC e TERRA são para a alimentação de energia e CONTROLE fornece a freqüência de controle de posição do servo-motor. 26 4. “AR+” – ROBÔ ARANHA DE QUATRO PATAS O Robô AR+ é um quadrúpede no formato de uma aranha que se movimenta de frente ou de lado, ele não executa movimentos circulares como, por exemplo, girar em torno de si mesmo. Cada uma das quatro patas do AR+ possui dois motores que permitem o movimento da pata. Como cada pata possui dois motores e o robô possui quatro patas, são necessários oito motores e uma placa para controle dos motores. Esses componentes são distribuídos da seguinte forma: PATA N C A PATA L G INTERFACE CONTROLE E F H PATA O B PATA S D Figura 16 – Identificação das patas e motores MOTORES PATA SUPERIOR INFERIOR N A C S B D L E G O F H Tabela 1 – Posição dos motores nas patas 27 A tabela acima indica quais motores pertencem a qual pata e em qual parte da pata o motor está situado. Por exemplo, a pata N possui o motor A na parte superior e o motor C na parte inferior. A atribuição de letras para cada motor é válida a partir do momento em que os motores são conectados na placa servo-controladora, pois é na placa que estão descritos quais contados do circuito onde é conectado o servo-motor pertence a qual letra de identificação. Como é possível observar na figura 16 e na tabela 1, os motores não estão distribuídos em seqüência nas patas. O programa agrupa os motores em dois grupos: grupo X = {A, B, C, D} e grupo Y = {E, F, G, H}. O grupo X tem prioridade sobre o grupo Y, ou seja, durante a execução dos comandos, a seqüência do grupo X sempre é enviada primeiro que a seqüência do grupo Y. No decorrer deste documento, veremos mais detalhes sobre como os comandos são enviados para o robô. As patas dianteira e traseira pertencem ao grupo X, então, podemos dizer que elas têm prioridade sobre as patas laterais, que pertencem ao grupo Y. Portanto, os movimentos serão executados primeiro pelas patas dianteiras e depois pelas patas laterais. Mas por que executar apenas duas patas de cada vez ao invés de oito? Os motores utilizados nas articulações das patas do AR+ consomem muita energia ao se movimentarem. Quanto mais motores forem movimentados simultaneamente, mais corrente elétrica (Amperes) será requerida da fonte de energia. Fontes de corrente contínua com potência suficiente para suprir os oito motores se movimentando simultaneamente são difíceis de encontrar, então, reduzindo o os movimentos simultâneos dos motores reduz a necessidade de fontes mais fortes, facilitando o acesso a fontes de energia capazes de funcionar o robô AR+. Ao movimentar duas patas são movimentados quatro motores simultaneamente. 4.1 Movimento O robô AR+ anda em quatro direções: para frente, para trás, para a esquerda e para a direita. Para se mover, ele não executa rotações em torno de seu próprio eixo, ou seja, quando anda para a esquerda, por exemplo, todo o corpo do robô é deslocado para a esquerda mantendo sempre a frente voltada para a mesma direção. 28 Quando se move para frente, as patas laterais apóiam-se na superfície de modo a liberar o movimento das patas dianteiras e traseiras. As patas liberadas tomam a posição inicial de um passo para frente, ou seja, ficam estendidas para frente. Quando as patas dianteiras e traseiras estão posicionadas, as patas laterais são levantas deixando todo o apoio nas patas dianteiras e traseiras, que, assim que estiverem apoiadas, se movimentam para trás, tomando a posição final e deslocando o corpo do robô para frente. Para se mover para trás, é executado um movimento semelhante ao de mover para frente, onde apenas as posições inicial e final são invertidas. E para se mover para esquerda ou direita, as patas que apóiam são a dianteira e a traseiras e as patas laterais assumem os movimentos inicial e final. Para que o robô execute os movimentos de cada motor para movimentar as patas e se deslocar, o software ARc é responsável por coletar os comandos fornecidos pelo operador, tratar esses comandos e envia-los para o robô. A seguir, será detalhado a construção e o funcionamento do software de controle do robô AR+ (ARc). 4.2 Projeto O projeto foi desenvolvido na linguagem Java versão 1.5.0. Duas Bibliotecas de expansão foram utilizadas no projeto: o driver JDBC para o banco de dados Firebird e; API javax.comm, utilizada para envio dos comandos via porta serial. Foram criados módulos (Classes) com funções específicas para cada parte o sistema. Os módulos controlam desde a conexão com o banco de dados, as telas de interação com o operador até mecanismos de escalonamento e ajuste de espera. Grande parte dos módulos necessita de parâmetros de ajuste para executar corretamente as funções atribuídas. Esses parâmetros são armazenas e podem ser ajustados pelo operador, de acordo com a necessidade. O sistema foi dividido em dois níveis: nível Baixo e nível Alto. Onde cada nível possui funções e módulos exclusivos ou compartilhados. Os módulos podem ser classificados em: módulos de controle, informação, interação e núcleo, onde a classificação é dada de acordo com a função do módulo. 29 5. DIVISÃO DO SISTEMA “ARc” O sistema ARc é dividido em duas partes onde cada parte é chamada de Nível, respectivamente, Nível Baixo e Nível Alto. Os níveis foram criados para dividir o processo de desenvolvimento do sistema, onde o nível Baixo compreende os módulos necessários para que um determinado comando chegue ao robô com as informações ajustadas e corretas e, o nível Alto, compreende os módulos necessários para construir, armazenar e reutilizar os comandos a serem enviados para o robô e permitir a interação do usuário operador. Há um módulo especial que não pertence a nenhum dos níveis. Esse módulo, chamado Núcleo, é responsável pela interação dos outros módulos, tanto do nível Alto quanto do nível Baixo. Além da divisão do sistema em níveis há uma outra divisão criada para agrupar os módulos com um propósito em comum. As divisões dos módulos são: Módulos de informação, Módulos de Controle, Módulos de Interação e Núcleo. Os módulos de Controle, Interação e Núcleo recebem e retornam informações, portanto, é necessário entender, primeiro, como as informações são organizadas (módulos de Informação). Nota: A partir deste momento, os módulos de informação serão chamados de Classes para facilitar a compreensão quando estivermos relatando os módulos de controle e serão utilizadas notações peculiares da linguagem Java (linguagem em que o sistema foi desenvolvido). 5.1 Classes de Informação (Módulos de Informação) As classes (ou módulos) de informação são unidades cuja função é servir como um grupo de informações em comum, ou seja, uma forma de agrupar informações para representar um determinado objeto. Por exemplo, uma classe Motor possui informações de posição e tempo de espera utilizadas em um motor real do robô AR+. A seguir, uma descrição das classes de Informação: 30 MOTOR É a unidade básica de informação do sistema. O Motor é a abstração do modelo físico do Servo-motor utilizado no robô AR+ e está contido em todas as classes de informação. Em alguns momentos a referência para essa classe será feita como Informação de Motor. A classe Motor possui as informações necessárias para o controle do motor real. Essas informações são: Ì Valor: posição do eixo que deve ser assumida pelo motor real. Ì ID: identificação do motor real interpretada pela placa servo-controladora. Ì Delay: tempo de espera necessário para que o motor real complete o movimento indicado pela informação valor. FILA MOTOR É uma fila do tipo FIFO de classes do tipo Motor com algumas modificações. A FilaMotor permite as seguintes ações: Ì Inserção: insere um Motor no fim da fila. Ì Remoção: remove o primeiro Motor da fila. Ì Alteração: permite alterar um determinado Motor da fila. Altera o Motor apenas por outro Motor, não permite exclusão. Ì Consulta: permite consultar as informações de um Motor da fila. A FilaMotor utiliza uma classe de informação exclusiva chamada ElementoFilaMotor. Essa classe serve apenas para organização da FilaMotor, portando, não é utilizada em outras classes do sistema. COMANDO É a abstração de uma ação (um comando) enviada para o robô. O Comando é composto por quatro classes do tipo FilaMotor, que representam as quatro patas do robô: N, S, L e O. Portando, o Comando possui informações para todos os motores reais do robô, em outras palavras, o Comando é um conjunto de informações dos motores reais necessárias para que o robô execute algum movimento. 31 COMANDO FilaMotor Motor N (ID Motor 1, Valor, Delay), (ID Motor 2, Valor, Delay, ...) S (ID Motor 1, Valor, Delay), (ID Motor 2, Valor, Delay, ...) L (ID Motor 1, Valor, Delay), (ID Motor 2, Valor, Delay, ...) O (ID Motor 1, Valor, Delay), (ID Motor 2, Valor, Delay, ...) Tabela 2 – Comando FILA COMANDO É uma fila do tipo FIFO de classes do tipo Comando. A FilaComando permite as seguintes ações: A Ì Inserção: insere um Comando no fim da fila. Ì Remoção: remove o primeiro Comando da fila. Fila de Comandos utiliza uma classe de informação exclusiva chamada ElementoFilaComando. Essa classe serve apenas para organização da Fila de Comandos, portando, não é utilizada em outras classes do sistema. COMANDO ESCALONADO Um comando possui quatro filas motor e passa por vários processos até ser enviado para o robô. O robô recebe apenas uma informação de cada vez, então, o comando passa por um módulo chamada Escalonador e é convertido em um comando escalonado. O comando escalonado possui uma única fila motor com as informações de motor ajustadas na seqüência correta para serem enviadas. FILA COMANDO ESCALONADO Assim como a Fila de Comandos, a Fila de Comnados Escalonada é uma fila do tipo FIFO de classes do tipo Comando Escalonado. A Fila de Comandos Escalonados permite as seguintes ações: Ì Inserção: insere um Comando no fim da fila. Ì Remoção: remove o primeiro Comando da fila. A Fila de Comandos Escalonados também utiliza uma classe de informação exclusiva chamada ElementoFilaComandoEscalonado. Essa classe serve apenas para organização da Fila de Comandos Escalonados, portando, não é utilizada em outras classes do sistema. 32 NPA A classe NPA representa um Núcleo Primário de Ação, que contém um determinado Comando que é enviado para o robô. O NPA contém as seguintes informações: Ì ID: Identificação do NPA; Ì Comando: uma informação do tipo Comando. O NPA possui métodos que permitem apenas coletar o ID e o Comando. Essas duas informações do NPA são definidas no construtor NPA. NSA A classe NSA representa um Núcleo Secundário de Ações. O Núcleo Secundário de Ações é uma lista de execução onde os itens dessa lista são NPA’s e/ou outros NSA’s. A lista é executada em seqüência. O NSA contém as seguintes informações: Ì ID: Identificação do NSA; Ì Lista: lista de NPA’s ou NSA’s. A informação Lista é do tipo Vector<BDListaElemento>, onde Vector é uma classe utilizatária do java pra trabalhar com vetores (java.util.Vector) e BDListaElemento é uma classe utilizada somente pelo NSA para permitir o armazenamento de informações do NPA/NSA listado. Essas informações são: ID, Tipo (NSA/NPA). NSA PROCESSADO Antes de ser executado, o NSA deve ser desmontado em comandos, ou seja, todos os itens da lista do NSA, sejam NPA’s ou outros NSA’s devem ser lidos e armazenados em uma única fila de comandos escalonados pronta para a execução. Ao desmontar um NSA, os comandos e as informações de motores dos comandos passam por diversos processos como o Controle de Delay e o Escalonador (ambos serão vistos mais adiante). Ao concluírem a passagem por esses processos, as informações estão prontas para serem enviadas ao robô, mas, ao invés disso, são armazenadas em um arquivo que, posteriormente, poderá ser enviado para o robô em conjunto com outros arquivos. Cada arquivo é representado por um NSA Processado. O NSA Processado possui uma informação de identificação (ID) e um comando escalonado, onde estão todos os comandos prontos para serem enviados ao robô. 33 6. NÍVEL BAIXO O operador cria uma seqüência de comandos e, em determinado momento, solicita a execução dessa seqüência pelo robô AR+. Uma seqüência de comandos passa por diversos módulos até ser, literalmente, enviada para o robô. Esses módulos compõem o Nível Baixo do Sistema de Controle do robô AR+. Os módulos que compõem o nível Baixo são: Controle de Delay, Escalonador, Serial CMDE e Transm. A seguir uma descrição desses módulos: CONTROLE DE DELAY Os motores do AR+ executam movimentos de rotação no seu eixo onde podem rotacionar com limite de 120°. O sistema envia a informação da posição que cada motor deve assumir, ou seja, o sistema informa se o motor deve se posicionar a 0°, 35°, etc, informando o valor correspondente ao ângulo. Essa informação é tratada como um movimento. Quando um movimento é enviado para algum dos motores do robô, o motor precisa de um determinado tempo para executar tal movimento. Esse tempo de espera necessário é chamado de delay. O Controle de Delay calcula o delay necessário para que o motor realize o movimento indicado. O sistema envia a informação do movimento para um determinado motor e aguarda o tempo indicado pelo delay para enviar outra informação ao mesmo motor, que por sua vez, possui outro tempo de delay. Se o tempo de delay não for respeitado, o motor não completará o movimento em execução, passando a assumir o novo movimento enviado. Para calcular o delay necessário para o movimento enviado ao motor, o Controle de Delay possui um parâmetro configurável que informa quanto tempo o motor leva para executar um movimento de 50º. É efetuado um calculo usando uma regra de três e o resultado é o delay necessário para executar o movimento enviado para o motor. O Controle de Delay recebe uma Fila de Comandos e atribui delay a todos os motores contidos nos comandos da fila de comandos, retornando a fila ajustada para outro módulo utilizar. 34 ESCALONADOR O robô AR+ possui quatro patas, então foi criada a classe Comando que possui quatro filas de motores, onde cada fila de motores representa uma pata do robô. O problema é que para enviar os comandos para o robô, apenas um comando pode ser enviado de cada vez, ou seja, as quatro filas de motores de um comando precisam virar uma só de forma que as informações sejam enviadas na ordem correta. A função do Escalonador é mesclar as quatro filas de motores de um comando em uma fila. O comando que passa pelo Escalonador é transformado em um Comando Escalonado. A estratégia de escalonamento empregada pelo escalonador é simples: são removidas algumas informações de motores do comando selecionado, nos quais representam o movimento de duas patas; os delays das informações de motores removidas são verificados e é selecionado a informação de motor com o maior delay; as outras informações de motores não selecionadas são ajustadas com delay igual a zero; as informações de motores são inseridas em um comando escalonado sendo a última informação inserida a selecionada com o maior delay. Quando o módulo Transm (será visto a seguir) ler um comando escalonado, vai ler a informação de motor e aguardar o tempo indicado pelo delay para, somente após esperar, ler a próxima informação de motor. Por isso as informações de motores que continham delay menor são ajustadas para zero, fazendo com que todas sejam enviadas rapidamente, uma após a outra, de forma que os motores sejam sincronizados e aguarda o maior delay entre as informações de motores enviadas garantindo a execução de correta de todos os motores do robô. O Escalonador recebe uma fila de comandos, processa e retorna um fila de comandos escalonada. 35 Informações de Motores Maior delay COMANDO N A1 A2 A3 A4 S B1 B2 B3 B4 L C1 C2 C3 C4 O D1 D2 D3 D4 COMANDO ESCALONADO A1 A2 Filas de Informações de Motores B2 B1 Figura 17 - Escalonador SERIAL CMDE Foi visto anteriormente que um NSA Processado é armazenado em arquivo para depois ser executado. O módulo Serial CMDE é o módulo responsável por gravar e ler um arquivo NSA Processado. O nome Serial CMDE quer dizer “Comando Escalonado Serializado”. Este módulo utiliza a interface Serializable e recursos de gravação de arquivos do Java para manipular os arquivos NPA Processados. A classe NPAProcessado é gravada em um arquivo utilizando um ObjectOutputStream e lida utilizando um ObjectInputStream. Ao gerar um arquivo, o Serial CMDE grava o nome do arquivo no banco de dados para poder referenciar o arquivo e, ao excluir o arquivo, o registro no banco de dados também é removido. O nome do arquivo e da entrada no banco de dados é o mesmo do NSA que originou o NSA Processado. 36 TRANSM O sistema ARc utiliza um módulo especial para envio dos comandos. Esse módulo utiliza a biblioteca de expansão javax.comm fornecida pela Sun. A javax.comm permite o controle das portas de comunicação do computador. No caso deste projeto, a javax.comm é utilizada para controlar a porta serial. O TRASM recebe uma fila de comandos escalonada e faz o envio seqüencial das informações de motores contida nas filas, sempre respeitando o delay indicado em cada informação de motor. 37 6.1 Relação Entre os Módulos do Nível Baixo Fila de Comandos Controle de Delay Fila de Comandos Escalonador Arquivo Serializado Serial CMDE Fila de Comandos Escalonada Serial CMDE Fila de Comandos Escalonada TRANSM AR+ Figura 18 – Relação entre os módulos do nível Baixo 38 7. NÍVEL ALTO Como visto, quando se tem uma seqüência de comandos e essa seqüência é enviada para o robô, os módulos pelo qual essa seqüência passa constituem o nível Baixo. Mas como a seqüência de comandos foi criada? O nível Alto compreende os módulos necessários para criar, armazenar e reutilizar os comandos a serem enviados para o robô e permitir a interação do usuário operador. Esses módulos pertencentes ao nível Alto estão distribuídos em duas categorias: Controle e Interação. 7.1 Módulos de Controle CONEXÃO O sistema ARc armazena informações em um banco de dados. O módulo Conexão é responsável por carregar os drivers necessários e executar a conexão com o banco de dados. Atualmente, o ARc conecta ao banco de dados Firebird utilizando um driver JDBC próprio do Firebird. Se for necessário a troca do banco de dados ou do driver de conexão, essa troca é feita somente no módulo Conexão, que passa a disponibilizar acesso ao banco de dados para todo o programa. CONTROLE BD O Controle BD é responsável por executar todas as manipulações na base de dados, ou seja, é ele que insere, altera e remove dados da base de dados. Qualquer módulo do sistema que precise gravar ou ler informações do banco de dados faz uma chamada para o Controle BD, no qual retorna a informação solicitada. 39 DESMONTADOR NSA Como visto anteriormente, o NSA é uma lista de execução que possui itens NPAs e/ou NSAs. Quando o NSA é preparado para execução, todos os comandos dos itens da lista NSA devem ser extraídos e preparados em uma fila de comandos. Ao encontrar um NPA na lista NSA, o Desmontador extrai o comando do NPA encontrado e o coloca em uma fila. Quando é encontrado um NSA na lista NSA, ele deve ser desmontado, então, o Desmontador cria uma nova instância de si mesmo e informa a fila de comandos onde devem ser armazenados os comandos e o NSA que deve ser desmonstado. Um NSA é um espécie de árvore onde os nós são ou outros NSAs da lista e as folhas são os NPAs. O Desmontador efetua as lituras das folhas dessa árvore efetuando uma busca por profundidade. Ao concluir a leitura do NSA (árvore), o Desmontador retorna uma fila de comandos contendo todos os comandos (folhas). NSA 1 NSA 2 NPA 5 NSA 4 NPA 1 NSA 3 NPA 6 NSA 5 NPA 2 NPA 3 NPA 4 NPA 7 NPA 8 Figura 19 – Árvore do Desmontador NSA Observando a árvore acima, é possível entender a leitura feita pelo Desmontador. A fila de comandos possui a mesma seqüência dos NPAs encontrados na árvore, já que um NPA é um comando. 40 VALIDADOR NSA Como visto, o NSA é um árvore onde os comandos são as folhas. O sistema ARc permite a edição de NSAs. Supondo que existam três NSAs onde o primeiro chama o segundo, o segundo o terceiro e o terceiro o primeiro. Ao executar qualquer um desses NSAs, o programa ficaria em redundância, ou seja, a execução ficaria presa em um loop infinito, causando o travamento do sistema. NSA 1 NSA 2 NSA 3 NPA ? Figura 20 – Loop na execução de um NSA O Validador NSA foi criado para verificar se o NSA a ser executado não possui referências circulares. Se nenhuma referência circular for encontrada e execução procede normalmente, caso contrário, a execução é interrompida. 41 7.2 Módulos de Interação TELA PRINCIPAL Figura 21 – Tela Principal A tela principal do sistema ARc permite executar o processamento, a execução de comandos e o acessa as telas de edição de NSAs e NPAs. Os NSAs criados aparecem na parte esquerda da tela na lista “NSAs” e podem ser selecionados e processados. Ao processar um NSA ele aparece na lista “NSAs Processados” situada ao centro. Os NSAs Processados podem ser selecionados para execução onde, ao selecionar, são adicionados à “Lista de Execução” onde são executados sequencialmente conforme a lista. A pequena lista situada a parte inferior esquerda da tela é o LOG, onde aparecem as mensagens de ações executadas pelo sistema. 42 TELA DE EDIÇÃO DE NPA Figura 22 – Tela de edição NPA A tela de edição de NPA permite criar um NPA dispondo controles para configuração dos movimentos dos motores, ou seja, permite que o usuário operador configure as informações de motores que serão inseridas no NPA criado. A tela de edição de NPA é dividida em quatro partes: sliders de controle, listas de informações de motores, botões de ação e conclusão de NPA. Sliders de controle: Há um slider para cada motor do robô. Os sliders são controles deslizantes e permitem configurar o valor que cada motor deve assumir para realizar um movimento. 43 Listas de informações de motores: Todas as informações de motores são adicionadas nas listas. Cada lista representa um motor específico. Os itens das listas podem ser adicionados ou removidos, sempre que um item de uma lista é removido um item de mesma posição das outras listas também é removido. Botões de ação: Os botões de ação permitem adicionar, remover e visualizar as informações que estão sendo editadas. Os botões são os seguinte: Ì ADD: Adiciona os valores indicados nos sliders nas listas. Ì Resetar: Volta a posição de todos os sliders para a posição inicial. Ì Visualizar: faz com que o robô assuma a posição indicada nos sliders, permitindo ver a posição real a ser tomada pelos motores do robô. Ì Editar: Lê as informações selecionadas nas listas e ajusta os sliders. Ì Limpar: Remove todas as informações das listas. Ì Remover: remove os itens selecionados nas listas. Conclusão de NPA: É onde é inserido o nome do NPA e é escolhida a opção Salvar ou Cancelar. 44 TELA DE EDIÇÃO DE NSA Figura 23 – Tela de Edição NSA A tela de edição de NSA permite criar, editar e excluir um NSA. Esta tela é composta por três partes: NPA, NSA e Novo NSA. Parte NPA: Todos os NPAs existentes são exibidos em uma lista onde podem ser selecionados para fazer parte do novo NSA, editados ou excluídos. Ao adicionar um NPA como parte de um novo NSA ele aparece na lista Novo NSA. Parte NSA: Assim como os NPAs, os NSAs existentes são exibidos numa lista onde podem ser selecionados para fazer parte do novo NSA, editados ou excluídos. Ao adicionar um NSA com parte de um novo NSA ele aparece na lista Novo NSA. Parte Novo NSA: Os NPAs e NSAs são adicionados a lista Novo NSA para serem parte do novo NSA. Esta parte é utilizada para criar, salvar e editar NSAs. 45 TELA DE CONFIGURAÇÃO Figura 24 – Tela de Configuração A tela de Configuração permite ajustar alguns parâmetros do sistema ARc, como inicialização dos motores, login do banco de dados e tempo de delay. As configurações de inicialização dos motores permitem ajustar qual a posição que deve ser assumida pelo robô no momento da carga do sistema. As informações de banco de dados indicam o nome de usuário e senha para serem utilizados na abertura do banco de dados e onde está o arquivo de banco de dados. O tempo de delay é o parâmetro utilizado pelo módulo do nível Baixo Controle de Delay para calcular o tempo necessário para o robô executar o movimento. Os botões salvar e cancelar permitem salvar ou não as alterações nas configurações. 46 7.3 Relação Entre os Múdulos do Nível Alto EDIÇÃO DE NPA PRINCIPAL CONFIGURAÇÕES EDIÇÃO DE NSA CONTROLE BD NPA CONEXÃO NSA DESMONTADOR NSA FILA DE COMANDOS Figura 25 - Relação Entre os Múdulos do Nível Alto VALIDADOR NSA 47 8. NÚCLEO Como visto anteriormente, o sistema ARc foi dividido em dois níveis que possuem módulos que comunicam entre si. O problema é: como fazer a comunicação entre os módulos do mesmo nível e/ou de um nível diferente? O Núcleo se comunica com todos os módulos do sistema, de forma a centralizar as chamadas aos módulos, ou seja, se um módulo precisa enviar ou coletar informações de outro módulo solicita ao núcleo que execute a ação. O Núcleo se encarrega de solicitar e enviar as informações para os módulos. Para fazer com que o Núcleo veja e seja visto por todos os módulos, todos os módulos são carregados a partir do Núcleo e recebem uma referência do núcleo no momento de sua criação. Para explicar melhor vamos utilizar termos da linguagem Java: Os módulos são instanciados dentro do Núcleo e uma referência do Núcleo é passada no construtor dos módulos. Por exemplo, para exibir os NSAs existentes na tela Principal, a tela Principal solicita ao Núcleo que solicite ao Controle BD uma lista de NSAs, o Núcleo executa a tarefa e retorna a lista para a tela Principal. Por intermediar a comunicação entre os módulos dos dois níveis, o Núcleo não pertence a nenhum dos níveis, fica situado externamente aos dois níveis. O Núcleo, além centralizar todos os módulos, também armazena as informações de parâmetros utilizadas pelos módulos. Para isso possui um módulo de informação próprio chamado Parâmetros. PARÂMETRO: MÓDULO DE INFORMAÇÃO As informações contidas no módulo Parâmetro são gravadas em um arquivo de propriedades do Java, o properties. A classe properties do Java tem a função de armazenar identificadores e valores, normalmente, em um arquivo texto com extensão .properties. Esse arquivo é lido sempre que o programa inicia e pode ser gravado sempre que o usuário operador alterar as configurações e clicar no botão ‘Salvar’ na tela Configurações. 48 Abaixo, um diagrama representativo de como é a relação entre os módulos através do Núcleo: Módulos do nível Alto Núcleo Todos os módulos, com exceção dos módulos de informação, precisam passar pelo núcleo para se comunicarem, inclusive os módulos de mesmo nível. Módulos do nível Baixo Figura 26 – Relação entre os módulos através do 49 9. BANCO DE DADOS O sistema ARc armazenas informações como NPAs e NSAs em um banco de dados para que essas informações possam ser utilizadas mais de uma vez. O banco de dados utilizado neste Trabalho de Conclusão de Curso é o Firebird 1.5 que é acessado pelo java através de um driver JDBC. Apenas recursos de leitura e gravação em tabelas são utilizados. A seguir veremos quais são as tabelas utilizadas pelo sistema e como o mapeamento de um módulo de informação (classe) foi feito para o banco de dados: 9.1 Tabelas O sistema ARc utiliza cinco tabelas: Comando, NPA, NSA, NSA_LISTA e PROC. Tabela COMANDO: A tabela COMANDO armazena as informações de uma classe Comando. Os campos da tabela COMANDO são: Ì NPA: Referência do NPA ao qual o comando armazenado pertence. Ì PATA: Identificador que indica qual fila de motores (pata) do comando o motor pertence. Ì MOTOR: Identificação do motor que deverá receber o valor armazenado. Ì VALOR: Valor a ser passado para o motor. (Lembrando que as informações de motores de um comando passa por diversos ajustes até chegar ao robô) Ì ORDEM: Garante que a ordem de leitura das informações da tabela seja a mesma mostrada durante a criação do comando. Abaixo, veja um exemplo de como acontece o mapeamento do objeto Comando para a tabela COMANDO, respectivamente: (onde: V = valor e D = delay) 50 COMANDO FilaMotor Motor N (N1, V1, D1), (N2, V2, D2), ..., (Nn, Vn, Dn) S (S1, V1, D1), (S2, V2, D2), ..., (Sn, Vn, Dn) L (L1, V1, D1), (L2, V2, D2), ..., (Ln, Vn, Dn) O (O1, V1, D1), (O2, V2, D2), ..., (On, Vn, Dn) Tabela 3 - Comando NPA PATA MOTOR VALOR ORDEM NPA 1 N N1 V1 01 NPA 2 N N2 V2 05 NPA 1 S S1 V1 02 NPA 1 S S2 V2 06 NPA 1 L L1 V1 03 NPA 3 L L2 V2 07 NPA 3 O O1 V1 04 NPA 2 O O2 V2 08 Tabela 4 – Exemplo de Comando armazenado Os comandos só são salvos quando atribuídos a um NPA, ou seja, a tabela COMANDO é uma espécie de lista de informações de um NPA. O valor do campo ORDEM da tabela COMANDO é atribuído a medida que as informações vão sendo salvas. TABELA NPA A tabela NPA foi criada para armazenar as informações essenciais de cada NPA. Nesta versão do sistema ARc, a tabela NPA armazena apenas uma listagem de NPAs existentes, mas a intenção é já deixar o banco de dados preparado para inserir informações diferentes sem precisar reestruturar as tabelas. 51 TABELA NSA Assim como a tabela NPA, a tabela NSA também é uma listagem com a intentenção de deixar o banco de dados preparado. TABELA NSA LISTA Como visto anteriormente, um NSA possui uma lista cujos elementos podem ser NPAs ou NSAs. A tabela NSA LISTA foi criada para armazenar essa lista. Os campos da tabela NSA LISTA são: Ì NSA: Referência ao NSA no qual o elemento da lista pertence. Ì ITEM: Referência ao Item listado (nome NPA ou NSA). Ì TIPO: Tipo do item listado (NPA ou NSA). Ì ORDEM: Garante que a ordem de leitura das informações da tabela seja a mesma mostrada durante a criação da lista do NSA. Para poder mapear as informações de um NSA para a tabela NSA LISTA, existe uma classe chamada BDListaElemento utilizada exclusivamente para este fim. Ao solicitar gravação dos dados, a lista do NSA é convertida em uma lista de BDListaElemento e depois enviada para a gravação. A classe BDListaElemento possui as seguintes informações: Ì ID: Identificação (Nome) do item da lista (NPA ou NSA). Ì TIPO: Tipo do item (NPA ou NSA). O mapeamento do NSA, com a classe BDListaElemento fica simples: NSA: passo frente LISTA do NSA (BDListaElemento) ID TIPO Frente1 NPA Traz2 NPA Tabela 5 – Exemplo tabela NSA TABELA NSA LISTA NSA ITEM TIPO Passo frente Frente1 NPA Passo frente Traz2 NPA Tabela 6 – Exemplo tabela NSA Lista ORDEM 1 2 52 O campo NSA da tabela recebe o nome do NSA; o campo ITEM recebe o ID do BDListaElemento; o campo TIPO recebe o TIPO do BDListaElemento e; o campo ORDEM é incrementado conforme a leitura de cima para baixo na lista NSA. TABELA PROC Como visto, um NSA quando é processado, é gerado um arquivo com o nome do NSA. A tabela PROC armazena o nome desse arquivo indicando que o arquivo foi gerado. É apenas uma listagem de nomes de arquivos criados com o processamento de NSAs. 53 10. A TRAJETÓRIA DE UM COMANDO Até agora, vimos que os comandos passam por diversas alterações até serem transmitidos para o robô. Neste capítulo, veremos o trajeto que um comando faz desde sua criação até a execução do mesmo pelo robô. 10.1 Trajeto do comando na visão do operador Um comando nasce na tela de Edição de NPA, afinal, todos os NPA são comandos, equanto um NSA, é uma lista de comandos. Na tela de edição de NPA, o operador informa ao sistema a posição de cada motor e, após informar várias posições diferentes para um mesmo motor, dizemos que este motor executa um movimento. O operador informa várias posições para todos os motores do robô e salva o NPA. O NPA salvo é armazenado no banco de dados e é listado na tela de edição de NSA. Na tela de edição NSA o NPA criado pode ser selecionado para uma ou mais listas de execução de um novo NSA. O mesmo NPA pode ser incluido quantas vezes necessário em uma lista de um mesmo NSA, ou seja, o NSA pode possuir uma chamada para um determinado NPA várias vezes em sua lista. O operador, na tela de edição de NSA, cria um novo NSA contendo outros NPAs ou NSAs salvos e salva o novo NSA, que é armazenado no banco de dados e passa a ser listado na tela Principal. Na tela principal, o operador seleciona o NSA desejado e solicita que seja processado. O NSA é desmontado e é gerado um arquivo no computador contendo as informações dos movimentos executados pelo NSA processado. Ao processar um NSA, ele passa a ser listado na lista de NSAs Processados e pode ser selecionado para execução. O operador seleciona um ou mais NSAs Processados e solicita execução. Todas as informações dos NSAs Processados selecionadas para execução são concatenadas e enviadas para o robô. 54 10.2 Trajeto do comando na visão dos sistema Criando o NPA: Na tela de edição de NPA, o operador informou as posições dos motores e solicita que os dados sejam salvos como um novo NPA. Cada posição informada pelo operador é convertida em uma informação de motor (classe de informação Motor) e colocada em um Comando (classe de informação Comando). O Comando é inserido em uma classe NPA (classe de informação) juntamente com o nome atribuído ao novo NPA. O novo NPA é passado para o módulo Controle BD, acionado a partir do Núcleo, para ser salvo no banco de dados. O Controle BD lê todas as informações de motores dentro do NPA e salva no banco de dados. Criando o NSA: Na tela de edição de NSA, o operador seleciona os NPAs e NSAs que irão compor a lista de novo NSA e solicita que os dados sejam salvos como um novo NSA. A lista de NPAs e NSAs selecionados é inserida em uma nova classe NSA (classe de informação). Essa nova classe NSA é enviada para o Controle BD para ser salva. O Controle BD salva cada item das lista de execução do novo NSA no banco de dados. Processando um NSA para a exeucução: Na tela Principal, o operador escolhe o NSA e solicita que seja processado. Quando o operador escolhe o NSA, ele seleciona o nome do NSA em uma lista, então, o Controle BD utiliza esse nome selecionado e resgata as informações desse NSA no banco de dados, retornando uma classe NSA (classe de informação). Essa classe NSA precisa ser ajustada para que suas informações estejam corretas antes de serem enviadas para o robô, então é enviada aos módulos de controle. O primeiro módulo que o NSA percorre é o VALIDADOR (módulo do nível alto) que verifica se a lista não possui redundância que possa travar o sistema. Ao passar pelo Validador, o NSA segue para o DESMONTADOR (classe do nível alto) onde todas as informações de motores são extraídas para um Fila de Comandos (classe de informação). A Fila de Comandos contém todas as informações de motores do NSA na seqüência em que devem ser executados, então, essa Fila é enviada para os módulos do nível baixo onde as informações de motores serão ajustadas. 55 O primeiro módulo de nível baixo a receber a Fila de Comandos é o Controle de Delay que lê os valores de cada informação de motor em cada comando da fila de comandos. O dado valor em uma informação de motor (classe de informação Motor) é a posição que o motor deve assumir. O Controle de Delay verifica qual vai ser o movimento do motor de acordo com as informações de motores, calcula o delay necessário para que os movimentos sejam executados corretamente e atribui o delay para cada informação de motor nos comandos da fila de comandos. Após serem atribuídos os delays, a fila de comandos segue para o módulo Escalonador que ajusta os delays e mescla as filas internas de cada comando na fila de comandos, retornando uma fila de comandos escalonada. Essa fila de comandos escalonada é enviada para o módulo Serial CMDE onde é gerado um arquivo serializado com as informações da fila. Execução um NSA Processado: A partir do momento que é gerado o arquivo do NSA Processado, o nome desse NSa aparece na lista NSA Processados da tela principal, onde o operador pode seleciona-lo para execução. O operador seleciona e adiciona os NPAs Processados que deseja executar para a lista de execução e solicita execução da lista. Cada item da lista de execução é o nome de um NSA Processado. O sistema percorre todos os nomes de NSA Processados da lista de execução e, a cada nome, solicita ao Serial CMDE que des-serialize o NSA Processado, ou seja, o Serial CMDE lê o arquivo e retorna uma classe NSA Processado. A classe NSA Processado contém uma fila de comandos escalonada. Se forem selecionados mais de um NSA Processado para execução, o sistema lê arquivo a arquivo e concatena em seqüência todas as filas de comandos escalonados existentes nos NSA Processados lidos dos arquivos em uma única fila. A fila de comandos escalonados final é enviada para o módulo TRANSM que lê a fila e converte os comandos para um arquivo de texto (ASCII). A parte externa do módulo TRANSM lê o arquivo de texto e envias os comandos para a placa servo-controladora do robô através da porta serial. O arquivo texto possui duas informações distintas: o comando literalmente interpretado pelo robô e o delay que deve ser aguardado até o envio do próximo comando. Essas 56 informações são distribuídas linha a linha: nas linhas ímpares são lidos os comandos e nas linhas pares, os delays. 57 11. CONCLUSÃO Neste Trabalho de Conclusão de Curso desenvolvemos um robô tipo aranha servocontrolado, onde manifestamos as competências e habilidades específicas para a área de computação permitindo um aprendizado aprofundado da linguagem Java e sobre sistemas robóticos. O controle de robôs exige o uso de sistemas computacionais que permitam processamento em tempo real e linguagens de programação de mais baixo nível, contudo, conseguimos mostrar que a linguagem Java, apesar de interpretada, pode ter utilizada no desenvolvimento de interfaces para robótica. Mesmo sendo uma linguagem com execução mais lenta que as utilizadas atualmente para robótica, possui métodos que podem facilitar o desenvolvimento e o controle de aplicações robóticas. Com relação à funcionalidade e operacionalidade do robô, a estratégia utilizada empregando NSAs e NPAs mostrou-se eficaz na transmissão e controle dos movimentos, mesmo os movimentos sincronizado. Como trabalhos futuros, podemos incorporar uma câmera e sensores (ultra-som, infravermelho, ... ) permitindo o desenvolvimento de sistemas para a navegação autônoma de robôs com auto-aprendizado. Por outro lado, a linguagem java também permite a criação de uma máquina virtual para facilitar e padronizar sistemas de controle em robótica, ou seja, frameworks próprios para robótica móvel de forma a ter java como linguagem em comum de desenvolvimento. 58 Bibliografia UERJ, Universidade do Estado do Rio de Janeiro. Movimento dos animais tem aplicação na construção de robôs. Disponível em: http://www2.uerj.br/~agenc/htmmaterias/materias/2003mes08_07/01.htm Acesso em: 25.MAR.05 WIKIPÉDIA, Definição de cinemática. Disponível em: http://pt.wikipedia.org/wiki/Cinem%C3%A1tica Acesso em: 25.MAR.05 ALMEIDA, Luis. Luis de Almeida home page. Disponível em: http://sweet.ua.pt/~lda/index.htm Acesso em: 10.ABR.05 SEW-EURODRIVE. Home Page – Perguntas e Respostas. Disponível em: http://www.sew.com.br/modulos/faq/main_faq.asp Acesso em: 10.ABR.05 LIMA, Christiane. Home Page. Disponível em: http://www.robofull.hpg.ig.com.br/ Acesso em: 10.ABR.05 VIRGILIO. Newton Channel. Disponível em: http://members.xoom.virgilio.it/ailab/ Acesso: 12.ABR.05 VERLAB, Laboratório de Visão Computacional e Robótica. Robótica Móvel. Disponível em: http://www.lrvpa.dcc.ufmg.br/cursos/roboticamovel/ Acesso: 12.ABR.05 UFRN, Departamento de Engenharia de Computação e Automação. Notas de aula de Percepção Robótica. Disponível em: http://www.dca.ufrn.br/~lmarcos/courses/robotica/notes/index.html Acesso em: 21.ABR.05 SANTUCI CARVALHO, Marco Antônio. Utilização de robôs autônomos na detecção e desarmamento de minas terrestres. Disponível em: http://www.lrvpa.dcc.ufmg.br/. Acesso em: 15.MAI.2005 INOVAÇÃO TECNOLÓGICA, Redação. Robô brasileiro recupera turbinas de usinas hidrelétricas. Disponível em: http://www.inovacaotecnologica.com.br/noticias/noticia.php?artigo=010180041130 Acesso em: 25.MAI.2005 INOVAÇÃO TECNOLÓGICA, Redação. Robô submarino autônomo cruza a corrente do Golfo. Disponível em: http://www.inovacaotecnologica.com.br/noticias/noticia.php?artigo=010180041116 Acesso em: 25.MAI.2005 NETBEANS, Welcome. Disponível em: http://www.netbeans.org. Acesso em: 18.JUL.05 FERIBIRD, Relational Database for the New Millenium. Disponível em: http://firebird.sourceforge.net. Acessado em: 27.AGO.05. 59 JAVA, Java Tecology. Disponível em: http://java.sun.com. Acessado em: 3.JUN.05. PORTAL JAVA, A maior comunidade Java do Brasil. Disponível em: http://www.portaljava.com. Acessado em: 2.SET.05. ROBÔ CLUBE, Robótica e Eletrônica. Algumas dicas de como desenvolver o seu projeto. Disponível em: http://www.roboclube.com.br/mand.html. Acessado em: 2.SET.05. ANSÉNIO, CARLOS. Um Robot Aranha. Disponível em: http://www.intel.com/cd/corporate/education/emea/por/elem_sec/comp_awards/isef/success/ 221560.htm. Acessado em: 29.SET.05. KLICKEDUCAÇÃO, Robótica. Quem foram os antepassados dos robês industriais?. Disponível em: http://www.klickeducacao.com.br/Conteudo/Referencia/tecnologia/Item_View/0,1655,1009tecnologia-23---POR,00.html. Acessado em: 10.OUT.05. TOURINO, SÉRGIO ROBERTO GONÇALVES. Sistema de rastreamento para robôs móveis utilizando visão embarcada. Disponível em: http://www.graco.unb.br/~tourino/mestrado/dis.html. Acessado em: 22.MAI.05. CAEIRO, CÉLIA MARGARIDA; SERRA, DIANA ROLDÃO; JORGE, JOSEANA DIAS. O primeiro grande momento da inteligência artificial. Disponível em: http://www.citi.pt/citi_2005_trabs/ia/index.html. Acessado em: 19.JUN.05. JAVA, JavaTM 2 Platform Standard Edition 5.0 API Specification. Disponível em: http://java.sun.com/j2se/1.5.0/docs/api/index.html. Acessado em: 04.JUN.05. 1 ANEXO 1 – Código Fonte do Sistema ARc Para desenvolver o código do sistema foi utilizado o NetBeans IDE 4.1, encontrado em http://www.netbeans.org. CLASSES [ ar ] [ informação ] BDLista.java ............................................................................................3 Comando.java .........................................................................................3 ComandoEscalonado.java .....................................................................4 ElementoComando.java .........................................................................4 ElementoComandoEscalonado.java .....................................................5 ElementoMotor.java................................................................................5 FilaComando.java ...................................................................................6 FilaComandoEscalonado.java ...............................................................8 FilaMotor.java........................................................................................10 Motor.java ..............................................................................................12 NPA.java ................................................................................................13 NSA.java ................................................................................................13 NAProcessado.java ..............................................................................14 ValorMotores.java .................................................................................14 [ controle ] ControleDelay.java................................................................................16 Escalonador.java ..................................................................................19 SerialCMDE.java....................................................................................20 2 Transmissor.java ..................................................................................22 [ controle.bd ] Conexão.java ...................................................................................26 ControleBD.java ..............................................................................27 DesmontadorNSA.java ...................................................................35 ValidadorNSA.java ..........................................................................36 [ interação ] Config.java.............................................................................................39 Principal.java.........................................................................................47 Splash.java ............................................................................................55 TelaAguarde.java ..................................................................................57 TelaNPA.java..........................................................................................58 TelaNSA.java .........................................................................................81 [ núcleo ] Núcleo.java ............................................................................................88 Paramentros.java ..................................................................................93 Main.java......................................................................................................98 3 PACOTE: ar.informacao BDLista.java 1 /* 2 * BDLista.java 3 * 4 */ 5 6 package ar.informacao; 7 8 /** 9 * Utilizado para intermediar a passagem de dados do Banco de Dados e do NSA. 10 * @author Leonardo Torati 11 */ 12 public class BDListaElemento { 13 14 public String id, tipo; 15 16 /** 17 * 18 */ 19 public BDListaElemento(String ID, String TIPO) { 20 id = ID; 21 tipo = TIPO; 22 } 23 24 public String toString(){ 25 return id + " (" + tipo + ")"; 26 } 27 } 28 Comando.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /* * Comando.java */ package ar.informacao; /** * * @author Leonardo Torati */ public class Comando { public FilaMotor n, s, l, o; public int getElementos(){ int i = n.getElementos() + l.getElementos() + s.getElementos() + o.getElementos(); return i; } public String toString(){ 4 21 22 23 24 25 26 27 28 29 30 } } return ("CMD: " + getElementos()); public Comando(){ n = new FilaMotor("N"); s = new FilaMotor("S"); l = new FilaMotor("L"); o = new FilaMotor("O"); } ComandoEscalonado.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /* * ComandoEscalonado.java */ package ar.informacao; import java.io.Serializable; /** * * @author Leonardo Torati */ public class ComandoEscalonado implements Serializable{ public FilaMotor fila; public ComandoEscalonado(FilaMotor f){ fila = f; } public ComandoEscalonado(){ fila = new FilaMotor("X"); } } ElementoComando.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* * ElementoComando.java */ package ar.informacao; import ar.*; /** * * @author Leonardo Torati */ public class ElementoComando { 5 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } private Comando comando; private ElementoComando proximo; public public public public void setComando(Comando cmd){comando = cmd;} Comando getComando(){return comando;} void setProximo(ElementoComando p){proximo = p;} ElementoComando getProximo(){return proximo;} public String toString(){ return ("" + comando); } public ElementoComando(Comando c, ElementoComando p){ proximo = p; comando = c; } ElementoComandoEscalonado.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* * ElementoComandoEscalonado.java */ package ar.informacao; /** * * @author Leonardo Torati */ public class ElementoComandoEscalonado { 22 23 24 25 26 } private ComandoEscalonado comando; private ElementoComandoEscalonado proximo; public public public public void setComando(ComandoEscalonado cmd){comando = cmd;} ComandoEscalonado getComando(){return comando;} void setProximo(ElementoComandoEscalonado p){proximo = p;} ElementoComandoEscalonado getProximo(){return proximo;} public ElementoComandoEscalonado(ComandoEscalonado c, ElementoComandoEscalonado p){ proximo = p; comando = c; } ElementoMotor.java 1/* 2 * ElementoMotor.java 3 */ 4 5 package ar.informacao; 6 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import ar.*; import java.io.Serializable; /** * * @author Leonardo Torati */ public class ElementoMotor implements Serializable{ private Motor motor; private ElementoMotor proximo; public void setMotor(Motor m){motor = m;} public Motor getMotor(){return motor;} public void setProximo(ElementoMotor p){proximo = p;} public ElementoMotor getProximo(){return proximo;} public ElementoMotor(Motor m, ElementoMotor p){ motor = m; proximo = p; } } public String toString(){ return motor.getId() + motor.getValor(); } FilaComando.java 1/* 2 * FilaComando.java 3 */ 4 5 package ar.informacao; 6 7 /** 8 * 9 * @author Usuario 10 */ 11 import java.util.Vector; 12 import ar.informacao.ElementoComando; 13 import ar.informacao.Comando; 14 15 /** 16 * 17 * @author Leonardo Torati 18 */ 19 public class FilaComando{ 20 private Vector<ElementoComando> v; 21 private int qtd; 22 private ElementoComando inicio, fim; 23 24 public int getElementos(){return qtd;} 25 26 public Vector<ElementoComando> getVector(){ 7 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 } return v; public void adicionar(Comando c){ if(c != null){ //criar elemento ElementoComando e = new ElementoComando(c, null); //adicionar elemento v.add(e); //setar inicio e fim if(qtd == 0){ //primeiro elemento inicio = e; fim = e; }else{ fim.setProximo(e); fim = e; } //incrementar contador qtd++; } } public Comando remover(){ Comando retorno = null; if(qtd == 0){ //fila vazia retorno = null; }else{ //fila n?o vazia //remover cabe?a ElementoComando tmp; retorno = inicio.getComando(); tmp = inicio; inicio = inicio.getProximo(); tmp = null; //System.gc(); } } qtd--; return retorno; public Comando consultar(int pos){ Comando ret = null; if(qtd > 0 && pos <= qtd){ ElementoComando e = v.get(pos - 1); ret = e.getComando(); } } return ret; public void alterar(int pos, Comando c){ if(qtd > 0 && pos <= qtd && c != null){ ElementoComando e = v.get(pos -1); 8 86 87 88 89 90 91 92 93 94 95 96 97 } } } e.setComando(c); v.set(pos - 1, e); public FilaComando(){ v = new Vector<ElementoComando>(); inicio = null; fim = null; qtd = 0; } FilaComandoEscalonado.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 /* * FilaComandoEscalonado.java */ package ar.informacao; import java.util.Vector; import ar.*; //Comando, ElementoComando, FilaComando /** * * @author Leonardo Torati */ public class FilaComandoEscalonado{ private Vector<ElementoComandoEscalonado> v; private int qtd; private ElementoComandoEscalonado inicio, fim; public int getElementos(){return qtd;} public void adicionar(ComandoEscalonado c){ //pre: c nao eh null //pos: c adicionado em v e qtd incrementado if(c != null){ //criar elemento ElementoComandoEscalonado e = new ElementoComandoEscalonado(c, null); //adicionar elemento v.add(e); //setar inicio e fim if(qtd == 0){ //primeiro elemento inicio = e; fim = e; }else{ fim.setProximo(e); fim = e; } //incrementar contador qtd++; } } 9 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 } public ComandoEscalonado remover(){ //pre: qtd nao eh 0 //pos: elemento removido e retornado ComandoEscalonado retorno = null; if(qtd == 0){ //fila vazia retorno = null; }else{ //fila n?o vazia //remover cabe?a ElementoComandoEscalonado tmp; retorno = inicio.getComando(); tmp = inicio; inicio = inicio.getProximo(); tmp = null; //System.gc(); } qtd--; } return retorno; public ComandoEscalonado consultar(int pos){ //pre: pos eh valido //pos: retorna o motor do elemento em pos ComandoEscalonado ret = null; } if(qtd > 0 && pos <= qtd){ ElementoComandoEscalonado e = v.get(pos - 1); ret = e.getComando(); } return ret; public void alterar(int pos, ComandoEscalonado c){ //pre: pos eh valido e m != null //pos: motor do elemento na pos indicada eh reconfigurado } if(qtd > 0 && pos <= qtd && c != null){ ElementoComandoEscalonado e = v.get(pos -1); e.setComando(c); v.set(pos - 1, e); } public FilaComandoEscalonado(){ v = new Vector<ElementoComandoEscalonado>(); inicio = null; fim = null; qtd = 0; } 10 FilaMotor.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 /* * FilaMotor.java */ package ar.informacao; import java.io.Serializable; import java.util.Vector; import ar.*; //Motor, ElementoMotor, FilaMotor /** * * @author Leonardo Torati */ public class FilaMotor implements Serializable{ private Vector<ElementoMotor> v; private int qtd; private String id; private ElementoMotor inicio, fim; public int getElementos(){return qtd;} public String getId(){return id;} public String toString(){return (id + " (" + qtd + ")");} public Vector<ElementoMotor> getVector(){ return v; } public void adicionar(Motor m){ //pre: m nao eh null //pos: m adicionado em v e qtd incrementado if(m != null){ String mid = m.getId(); } } //criar elemento ElementoMotor e = new ElementoMotor(m, null); //adicionar elemento v.add(e); //setar inicio e fim if(qtd == 0){ //primeiro elemento inicio = e; fim = e; }else{ fim.setProximo(e); fim = e; } //incrementar contador qtd++; public Motor remover(){ //pre: qtd nao eh 0 //pos: elemento removido e retornado 11 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 Motor retorno = null; if(qtd == 0){ //fila vazia retorno = null; }else{ //fila n?o vazia //remover cabe?a ElementoMotor tmp; retorno = inicio.getMotor(); tmp = inicio; inicio = inicio.getProximo(); tmp = null; //System.gc(); } qtd--; } return retorno; public Motor primeiro(){ Motor retorno = null; if(qtd == 0){ //fila vazia retorno = null; }else{ //fila n?o vazia //remover cabe?a ElementoMotor tmp; } } retorno = inicio.getMotor(); return retorno; public Motor consultar(int pos){ //pre: pos eh valido //pos: retorna o motor do elemento em pos Motor ret = null; if(qtd > 0 && pos < qtd){ ElementoMotor e = v.get(pos); ret = e.getMotor(); } } return ret; public void alterar(int pos, Motor m){ //pre: pos eh valido e m != null //pos: motor do elemento na pos indicada eh reconfigurado if(qtd > 0 && pos < qtd && m != null){ ElementoMotor e = v.get(pos); e.setMotor(m); v.set(pos, e); 12 116 117 118 119 120 121 122 123 124 125 126 } } } public FilaMotor(String sid){ id = sid; v = new Vector<ElementoMotor>(); inicio = null; fim = null; qtd = 0; } Motor.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 /* * Motor.java */ package ar.informacao; import java.io.Serializable; /** * * @author Leonardo Torati */ public class Motor implements Serializable{ private int valor; //valor private int delay; private String id, nome; public void setValor(int v){ valor = v; } public public public public void setId(String s){id = s;} String getId(){return id;} void setNome(String n){nome = n;} String getNome(){return nome;} public void setDelay(int d){delay = d;} public int getDelay(){return delay;} public int getValor(){return valor;} public Motor(String s, int v, int d){ valor = v; delay = d; id = s; } public String toString(){return "" + id + valor + "(" + delay + ")";} } 13 NPA.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /* * NPA.java */ package ar.informacao; import ar.informacao.Comando; /** * * @author Leonardo Torati */ public class NPA { String id; Comando cmd; public String getId(){ return id; } public Comando getCmd(){ return cmd; } /** Creates a new instance of NPA */ public NPA(String ID, Comando CMD) { id = ID; cmd = CMD; } } public String toString(){ return id; } NSA.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* * NSA.java */ package ar.informacao; import ar.informacao.*; import java.util.Vector; /** * * @author Leonardo Torati */ public class NSA { private String id; private Vector<BDListaElemento> lista; public String getId(){ return id; } public Vector<BDListaElemento> getLista(){ return lista; } /** Creates a new instance of NSA */ public NSA(String ID, Vector<BDListaElemento> LISTA) { id = ID; lista = LISTA; } public String toString(){ return id; } 14 27 } NSAProcessado.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* * NSAProcessado.java */ package ar.informacao; /** * * @author Leonardo Torati */ public class NSAProcessado { private String id; private ComandoEscalonado cmde; public String getId(){ return id; } public ComandoEscalonado getComandoEscalonado(){ return cmde; } public void setComandoEscalonado(ComandoEscalonado c){ cmde = c; } /** Creates a new instance of NSAProcessado */ public NSAProcessado(String ID) { id = ID; cmde = null; } public NSAProcessado(String ID, ComandoEscalonado c) { id = ID; cmde = c; } } public String toString(){ return id + " ("+cmde.fila.getElementos()+")"; } ValorMotores.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* * ValorMotores.java */ package ar.informacao; /** * * @author Leonardo Torati */ public class ValorMotores { public int a, b, c, d, e, f, g, h; 15 15 16 17 18 19 20 21 } public ValorMotores(){ } public ValorMotores(int valPadrao){ a = b = c = d = e = f = g = h = valPadrao; } 16 PACOTE: ar.controle ControleDelay.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /* * ControleDelay.java */ package ar.controle; import ar.nucleo.*; import ar.informacao.*; import ar.nucleo.Nucleo; /** * * @author Leonardo Torati */ public class ControleDelay { private Nucleo nucleo; private FilaComando fentrada, fsaida; private int tempoDelay; private int da, db, dc, dd, de, df, dg, dh; /** * */ public void setEntrada(FilaComando fila){ fentrada = fila; } /** * */ public FilaComando getSaida(){ return fsaida; } /** * */ public void ajustarDelay(){ fsaida = new FilaComando(); Comando cmd; //descarregar fila de entrada if(fentrada != null){ while(fentrada.getElementos() > 0){ //remover proximo comando cmd = fentrada.remover(); //calcular fila cmd.n = calcular(cmd.n); cmd.s = calcular(cmd.s); cmd.l = calcular(cmd.l); cmd.o = calcular(cmd.o); 17 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 } } } //adicionar comando na saida fsaida.adicionar(cmd); nucleo.msg(fsaida.getElementos() + " Comandos.", true); private int getUltimoValor(Motor m){ if(m.getId().equals("A")){ return da; } if(m.getId().equals("B")){ return db; } if(m.getId().equals("C")){ return dc; } if(m.getId().equals("D")){ return dd; } if(m.getId().equals("E")){ return de; } if(m.getId().equals("F")){ return df; } if(m.getId().equals("G")){ return dg; } if(m.getId().equals("H")){ return dh; } return 0; } private void setUltimoValor(Motor m){ if(m.getId().equals("A")){ da = m.getValor(); return; } if(m.getId().equals("B")){ db = m.getValor(); return; } if(m.getId().equals("C")){ dc = m.getValor(); return; } if(m.getId().equals("D")){ dd = m.getValor(); return; } if(m.getId().equals("E")){ de = m.getValor(); return; } 18 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 } if(m.getId().equals("F")){ df = m.getValor(); return; } if(m.getId().equals("G")){ dg = m.getValor(); return; } if(m.getId().equals("H")){ dh = m.getValor(); return; } private FilaMotor calcular(FilaMotor fila){ int delay, ultimoVal, diferenca; Motor motor; //calcular delay para cada motor da fila //verificar motores for(int i=0;i<fila.getElementos();i++){ //consultar motor motor = fila.consultar(i); //diferença ultimoVal = getUltimoValor(motor); diferenca = Math.abs(ultimoVal - motor.getValor()); if(diferenca != 0){ //se não houver movimento, não é necessário inserir //delay do Motor delay = (tempoDelay * diferenca) / 50; delay); //aplicar novo delay ao motor Motor x = new Motor(motor.getId(), motor.getValor(), fila.alterar(i, x); } } //guardar ultimo valor enviado para o motor setUltimoValor(x); }/*else{ System.err.println("Comando não inserido"); }*/ return fila; /** * */ public ControleDelay(Nucleo n){ nucleo = n; Parametros p = nucleo.getParametros(); 19 170 171 172 173 174 175 176 } tempoDelay = p.getTempoDelay(); } fentrada = null; fsaida = null; Escalonador.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 /* * Escalonador.java */ package ar.controle; import ar.informacao.*; import ar.nucleo.Nucleo; /** * * @author Leonardo Torati */ public class Escalonador { Nucleo nucleo; FilaComando entrada; ComandoEscalonado cmde; String id; public void setEntrada(FilaComando fila){entrada = fila;} //executar um motor de cada fila no comando e aguardar o maior delay public void escalonar(String ID, boolean gravar){ id = ID; if(entrada != null && entrada.getElementos() > 0){ cmde = new ComandoEscalonado(); Comando cmd; Motor mn, ms, ml, mo, m; int delay; while(entrada.getElementos() > 0){ cmd = entrada.remover(); while(cmd.getElementos()>0){ delay = maiorDelay(cmd); mn ms ml mo = = = = cmd.n.remover(); cmd.s.remover(); cmd.l.remover(); cmd.o.remover(); m = new Motor(mn.getId(), mn.getValor(), 0); cmde.fila.adicionar(m); m = new Motor(ms.getId(), ms.getValor(), 0); 20 49 50 51 52 53 54 55 56 57 58 cmde.fila.adicionar(m); m = new Motor(ml.getId(), ml.getValor(), 0); cmde.fila.adicionar(m); m = new Motor(mo.getId(), mo.getValor(), delay); cmde.fila.adicionar(m); } } nucleo.msg("Escalonador: " + cmde.fila.getElementos() + " elementos no comando escalonado."); if(gravar == true) gravarNSAProcessado(); } } 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 } public ComandoEscalonado getSaida(){return cmde;} private int maiorDelay(Comando cmd){ int ret=0, delay; Motor m; m=cmd.n.primeiro(); delay = m.getDelay(); if(delay > ret) ret = delay; m=cmd.s.primeiro(); delay = m.getDelay(); if(delay > ret) ret = delay; m=cmd.l.primeiro(); delay = m.getDelay(); if(delay > ret) ret = delay; m=cmd.o.primeiro(); delay = m.getDelay(); if(delay > ret) ret = delay; } return ret; /** * */ public Escalonador(Nucleo n) { nucleo = n; entrada = null; } private void gravarNSAProcessado(){ NSAProcessado nsap = new NSAProcessado(id, cmde); nucleo.getControleBD().updateNSAProcessado(nsap); } SerialCMDE.java 1 /* 2 * SerialCMDE.java 21 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 */ package ar.controle; import ar.informacao.*; import java.io.*; /** * * @author Leonardo Torati */ public class SerialCMDE { //public void setCmde(ComandoEscalonado c){cmde = c;} //public void setId(String ID){id = ID;} public boolean serializar(ComandoEscalonado cmde, String id){ boolean ret = true; //criar e serializar arquivo if(id.equals("") == false && cmde != null){ try{ File file = new File(id + ".nsap"); FileOutputStream out = new FileOutputStream(file); ObjectOutputStream objout = new ObjectOutputStream(out); objout.writeObject(cmde); objout.close(); }catch(IOException e){ ret = false; e.printStackTrace(); } } }else{ ret = false; } return ret; public ComandoEscalonado deSerializar(String id){ //desserializar arquivo ComandoEscalonado cmde = null; if(id.equals("") == false){ File file = new File(id + ".nsap"); if(file.exists() == true){ try{ FileInputStream in = new FileInputStream(file); ObjectInputStream objin = new ObjectInputStream(in); cmde = (ComandoEscalonado) objin.readObject(); objin.close(); }catch(IOException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); } 22 61 62 63 64 65 66 67 } } } } return cmde; Transmissor.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 /* * Transmissor.java */ package ar.controle; import ar.nucleo.*; import ar.informacao.*; import java.io.*; import java.util.*; import javax.comm.*; /** * * @author Leonardo Torati */ public class Transm { private static Enumeration portList; private static CommPortIdentifier portId; private static SerialPort serialPort; private static OutputStream outputStream; private FilaComandoEscalonado fentrada; private String porta; private Nucleo nucleo; int motoresEnviados; private boolean portaAberta; public void setEntrada(FilaComandoEscalonado fila){ fentrada = fila; } public void transmitir(){ //preparar porta motoresEnviados = 0; if(preparar() == false){ ComandoEscalonado cmde; //descarregar todos os Motores da Fila if(fentrada != null){ nucleo.msg(fentrada.getElementos() + " Comandos. ", true); while(fentrada.getElementos() > 0){ //Descarregar proximo comandoEscalonado 23 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 cmde = fentrada.remover(); if(cmde != null){ //descarregar todos os motores e enviar para robo enviarMotores(cmde); } } nucleo.msg(motoresEnviados + " motores enviados."); } }else{ nucleo.msg("Erro na transmissão", "Não é possivel preparar para transmissão"); } } private void enviarMotores(ComandoEscalonado c){ Motor motor; //descarrega e envia motores do ComandoEscalonado if(c != null){ if(c.fila != null){ while(c.fila.getElementos()> 0){ //descarregar proximo motor motor = c.fila.remover(); //transmitir enviar(motor); } } } } motoresEnviados++; private boolean preparar() { boolean ret = false; portList = CommPortIdentifier.getPortIdentifiers(); if(portaAberta == false){ portaAberta = true; while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(porta)) { try { serialPort = (SerialPort) portId.open("AR", 2000); } catch (PortInUseException e) { ret = true; nucleo.msg("Abrir porta.", e.toString()); portaAberta = false; } try { outputStream = serialPort.getOutputStream(); nucleo.msg(serialPort.toString()); //########################## } catch (IOException e) { 24 ret = true; nucleo.msg("Preparar strem de saída.", 104 105 e.toString()); 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 portaAberta = false; } try { serialPort.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (javax.comm.UnsupportedCommOperationException e) { ret = true; nucleo.msg("Operação não suportada.", e.toString()); portaAberta = false; } } } } } } return ret; private void enviar(Motor m){ String msg = ""; int delay=0; if(m != null){ msg = m.getId() + m.getValor() + "\r"; delay = m.getDelay(); try { nucleo.msg(msg); //##################################################### outputStream.write(msg.getBytes()); } catch (IOException e) { nucleo.msg("Falha no envio dos dados.", e.toString()); }catch(NullPointerException e){ nucleo.msg("Falha no envio dos dados.", e.toString()); } } //delay timerDelay(delay); } private void timerDelay(int d){ //faz uma pausa de tamanho d long tatual = System.currentTimeMillis(); long tfinal = tatual + d; //nucleo.msg(">" + tatual); while(tfinal > System.currentTimeMillis()){ //esperar } //verificação - apagar ao concluir projeto //nucleo.msg("-" + System.currentTimeMillis()); 25 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 } } public Transm(Nucleo n){ nucleo = n; Parametros p = n.getParametros(); porta = p.getPortaSerial(); portList = null; portId = null; serialPort = null; outputStream = null; } portaAberta = false; 26 PACOTE: ar.controle.bd Conexão.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /* * Conexao.java */ package ar.controle.bd; import ar.nucleo.*; import java.sql.*; /** * * @author Leonardo Torati */ public class Conexao { private Nucleo nucleo; private String login, senha, arquivo; private Connection conn; public void conectar(){ conn = null; try { Class.forName("org.firebirdsql.jdbc.FBDriver"); conn = DriverManager.getConnection( "jdbc:firebirdsql:localhost/3050:" + arquivo, login, senha); nucleo.msg("Conectado ao Banco de Dados."); } }catch(ClassNotFoundException e){ nucleo.msg("Conectando no banco de dados.", e.toString()); e.printStackTrace(); }catch(SQLException e){ nucleo.msg("Conectando no banco de dados.", e.toString()); } public Connection getConnection(){ return conn; } /** * */ public Conexao(Nucleo n) { nucleo = n; login = nucleo.getParametros().getLogin(); senha = nucleo.getParametros().getSenha(); arquivo = nucleo.getParametros().getArquivo(); } } 27 ControleBD.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /* * ControleBD.java */ package ar.controle.bd; import import import import import import java.sql.*; ar.nucleo.*; ar.informacao.*; java.util.Vector; java.io.File; ar.controle.SerialCMDE; /** * * @author Leonardo Torati * * */ public class ControleBD { private private private private Nucleo nucleo; Connection conn; Statement stm; SerialCMDE scmde; //====CONEXÃO========================================================= ====== public void setConexao(Conexao c){ conn = c.getConnection(); } private void setStm(){ if(conn != null){ try{ stm = conn.createStatement(); }catch(SQLException e){ nucleo.msg("Preparando controle BD.", e.toString()); } }else{ nucleo.msg("Preparando controle BD.", "Conexão nula."); } } //====LISTAS========================================================== ====== public Vector<String> listaNSA(){ //retorn lista de NSA Vector<String> res = new Vector<String>(); ResultSet rs = null; String sql = "SELECT * FROM TAB_NSA;"; try{ 28 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 setStm(); rs = stm.executeQuery(sql); if(rs != null){ //estrair valor dos motores do Banco de Dados String str; while(rs.next()){ str = rs.getString("ID"); res.add(str); }; } }catch(SQLException ex) { nucleo.msg("Listando NSA.", ex.toString()); } } return res; public Vector<String> listaNSAProcessado(){ //retorn lista de NSA Vector<String> res = new Vector<String>(); ResultSet rs = null; String sql = "SELECT * FROM TAB_PROC;"; try{ setStm(); rs = stm.executeQuery(sql); if(rs != null){ //estrair valor dos motores do Banco de Dados String str; while(rs.next()){ str = rs.getString("ID"); res.add(str); }; } }catch(SQLException ex) { nucleo.msg("Listando NSA Processado.", ex.toString()); } } return res; public Vector<String> listaNPA(){ //retorn lista de NPA Vector<String> res = new Vector<String>(); ResultSet rs = null; String sql = "SELECT * FROM TAB_NPA;"; try{ setStm(); rs = stm.executeQuery(sql); if(rs != null){ //estrair valor dos motores do Banco de Dados 29 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 } String str; while(rs.next()){ str = rs.getString("ID"); res.add(str); }; }catch(SQLException ex) { nucleo.msg("Listando NPA.", ex.toString()); } } return res; //====CONSULTAS======================================================= ====== public ResultSet consulta(String sql){ ResultSet res = null; try{ setStm(); res = stm.executeQuery(sql); }catch(SQLException e){ nucleo.msg("Consulta SQL.", e.toString()); } } return res; public NPA consultaNPA(String id){ NPA npa = null; Comando cmd = new Comando(); ResultSet rs = null; String sql = "SELECT * FROM TAB_COMANDO WHERE NPA = "" + id + "" ORDER BY ORDEM;"; int valor; String motorId, pata; Motor motor; try{ setStm(); rs = stm.executeQuery(sql); if(rs != null){ while(rs.next()){ motorId = rs.getString("MOTOR"); pata = rs.getString("PATA"); valor = rs.getInt("VALOR"); } motor = new Motor(motorId, valor, 0); pata.toUpperCase(); if(pata.equals("N")){ cmd.n.adicionar(motor); if(pata.equals("S")){ cmd.s.adicionar(motor); if(pata.equals("L")){ cmd.l.adicionar(motor); if(pata.equals("O")){ cmd.o.adicionar(motor); } } } } 30 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 } if(cmd.getElementos() > 0){ npa = new NPA(id, cmd); } }catch(SQLException ex) { nucleo.msg("Consultando NPA.", ex.toString()); } } return npa; public NSA consultaNSA(String id){ NSA nsa = null; Vector<BDListaElemento> v = null; ResultSet rs = null; String sql = "SELECT * FROM TAB_NSA_LISTA WHERE NSA = "" + id + "" ORDER BY ORDEM;"; try{ setStm(); rs = stm.executeQuery(sql); if(rs != null){ v = new Vector<BDListaElemento>(); //estrair lista NSA BDListaElemento elemento; String aa, bb; while(rs.next()){ aa = rs.getString("ITEM"); bb = rs.getString("TIPO"); elemento = new BDListaElemento(aa, bb); } } v.add(elemento); } if(v.size() > 0){ nsa = new NSA(id, v); } }catch(SQLException ex) { nucleo.msg("Consultando NSA.", ex.toString()); } return nsa; public boolean consultaNSAProcessado(String id){ boolean nsap = false; ComandoEscalonado cmde = new ComandoEscalonado(); ResultSet rs = null; String sql = "SELECT * FROM TAB_PROC WHERE ID = "" + id + "";"; try{ 31 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 setStm(); rs = stm.executeQuery(sql); if(rs != null){ //testar se arquivo existe File file = new File(id + ".nsap"); if(file.exists() == true){ nsap = true; }else{ //se não há arquivo, eliminar bd excluirNSAProcessado(id); } } } }catch(SQLException ex) { nucleo.msg("Consultando NSA Processado.", ex.toString()); } return nsap; //====UPDATES========================================================= ====== public void updateNPA(NPA cnpa){ //verificar se existe npa, se sim, atualiza, se não, cria Vector<String> vsql = new Vector<String>(); NPA tmp = consultaNPA(cnpa.getId()); Comando cmd = cnpa.getCmd(); Motor m; int valor, ordem; String pata, motorId, npaId, sql; npaId = cnpa.getId(); int cont = cmd.n.getElementos(); for(int i=1; i<=cont; i++){ m = cmd.n.remover(); valor = m.getValor(); motorId = m.getId(); pata = "N"; ordem = i; sql = "INSERT INTO TAB_COMANDO (NPA, PATA, MOTOR, VALOR, ORDEM) VALUES (""+ npaId + "", "" + pata + "", "" + motorId + "", " + valor + ", " + ordem + ");"; vsql.add(sql); } cont = cmd.s.getElementos(); for(int i=1; i<=cont; i++){ m = cmd.s.remover(); valor = m.getValor(); motorId = m.getId(); pata = "S"; ordem = i; sql = "INSERT INTO TAB_COMANDO (NPA, PATA, MOTOR, VALOR, ORDEM) VALUES (""+ npaId + "", "" + pata + "", "" + motorId + "", " + 32 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 } valor + ", " + ordem + ");"; vsql.add(sql); cont = cmd.l.getElementos(); for(int i=1; i<=cont; i++){ m = cmd.l.remover(); valor = m.getValor(); motorId = m.getId(); pata = "L"; ordem = i; sql = "INSERT INTO TAB_COMANDO (NPA, PATA, MOTOR, VALOR, ORDEM) VALUES (""+ npaId + "", "" + pata + "", "" + motorId + "", " + valor + ", " + ordem + ");"; vsql.add(sql); } cont = cmd.o.getElementos(); for(int i=1; i<=cont; i++){ m = cmd.o.remover(); valor = m.getValor(); motorId = m.getId(); pata = "O"; ordem = i; sql = "INSERT INTO TAB_COMANDO (NPA, PATA, MOTOR, VALOR, ORDEM) VALUES (""+ npaId + "", "" + pata + "", "" + motorId + "", " + valor + ", " + ordem + ");"; vsql.add(sql); } tmp = consultaNPA(cnpa.getId()); if(tmp != null){ //apagar existente sql = "DELETE FROM TAB_COMANDO WHERE NPA = "" + cnpa.getId() + "";"; if(update(sql) == false){ nucleo.msg("Inserindo NPA na Base de Dados.", "Falha no DELETE."); } }else{ sql = "INSERT INTO TAB_NPA (ID) VALUES ("" + npaId + "");"; if(update(sql) == false){ nucleo.msg("Inserindo NPA na Base de Dados.", "Falha ao criar NPA na Tabela NPA."); } } for(int i = 0; i<vsql.size(); i++){ sql = (String) vsql.get(i); if(update(sql) == false){ nucleo.msg("Inserindo NPA na Base de Dados.", "Falha no Update."); break; } } } public void updateNSA(NSA item){ 33 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 Vector<String> vsql = new Vector<String>(); String sql, idNsa, idItem, tipo; int ordem; BDListaElemento bde; //preparar sqls da lista nsa int cont = item.getLista().size(); for(int i=0; i<cont; i++){ bde = item.getLista().get(i); idNsa = item.getId(); idItem = bde.id; tipo = bde.tipo; ordem = (i + 1); sql = "INSERT INTO TAB_NSA_LISTA (NSA, ITEM, TIPO, ORDEM) VALUES (""+ idNsa + "", "" + idItem + "", "" + tipo + "", " + ordem + ");"; } vsql.add(sql); //verificar se existe nsa, se sim, excluir e criar NSA tmp = consultaNSA(item.getId()); if(tmp != null){ //existe nsa, excluir sql = "DELETE FROM TAB_NSA_LISTA WHERE NSA = "" + item.getId() + "";"; if(update(sql) == false){ nucleo.msg("Inserindo NSA na Base de Dados.", "Falha no DELETE."); } }else{ sql = "INSERT INTO TAB_NSA (ID) VALUES ("" + item.getId() + "");"; if(update(sql) == false){ nucleo.msg("Inserindo NSA na Base de Dados.", "Falha ao criar NSA na Tabela NSA."); } } for(int i = 0; i<vsql.size(); i++){ sql = (String) vsql.get(i); if(update(sql) == false){ nucleo.msg("Inserindo NSA na Base de Dados.", "Falha no Update."); break; } } } public void updateNSAProcessado(NSAProcessado cnsa){ //verificar se existe npa, se sim, atualiza, se não, cria String sql; ComandoEscalonado cmde = cnsa.getComandoEscalonado(); String id = cnsa.getId(); boolean tmp = consultaNSAProcessado(id); if(tmp == false){ //apagar existente 34 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 sql = "INSERT INTO TAB_PROC (ID) VALUES ("" + id + "");"; if(update(sql) == false){ nucleo.msg("Inserindo NPA na Base de Dados.", "Falha ao criar NPA na Tabela NPA."); } } } //criar arquivo scmde = new SerialCMDE(); scmde.serializar(cmde, id); public boolean update(String sql){ boolean res = false; try{ setStm(); stm.executeUpdate(sql); nucleo.msg("Update efetuado."); res = true; }catch(SQLException e){ nucleo.msg("Atualização", e.toString()); } return res; } //====EXCLUSÕES======================================================= ===== public void excluirNPA(String id){ String sql; sql = "DELETE FROM TAB_COMANDO WHERE NPA = "" + id + "";"; update(sql); sql = "DELETE FROM TAB_NPA WHERE ID = "" + id + "";"; update(sql); } public void excluirNSA(String id){ String sql; sql = "DELETE FROM TAB_NSA_LISTA WHERE NSA = "" + id + "";"; update(sql); sql = "DELETE FROM TAB_NSA WHERE ID = "" + id + "";"; update(sql); } public void excluirNSAProcessado(String id){ String sql = "DELETE FROM TAB_PROC WHERE ID = "" + id + "";"; update(sql); //excluir arquivo File file = new File(id + ".nsap"); if(file.exists() == true){ if(file.delete() == false){ nucleo.msg("Falha ao deletar NSA Processado.", "Arquivo não deletado."); } } } 35 440 441 442 443 444 445 446 447 448 //====CONSTRUTOR====================================================== ===== /** * */ public ControleBD(Nucleo n, Conexao c) { nucleo = n; setConexao(c); } } DesmontadorNSA.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 /* * DesmontadorNSA.java */ package ar.controle.bd; import ar.nucleo.*; import ar.informacao.*; import java.util.Vector; /** * * @author Leonardo Torati */ public class DesmontadorNSA { Nucleo nucleo; FilaComando fila; Vector lista; ControleBD cbd; String id; Comando cmd; public } DesmontadorNSA(Nucleo n, String ID, Vector l, FilaComando f) { nucleo = n; cbd = n.getControleBD(); lista = l; id = ID; fila = f; private int verificarLista(String ID){ int res = -1; String str; for(int i = 0; i<lista.size(); i++){ str = (String) lista.get(i); if(str.equals(ID)){ res = i; } } } return res; //se > -1: encontrou na lista public boolean desmontar(){ 36 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 } boolean res = true; NSA tmp = cbd.consultaNSA(id); if(tmp != null){ Vector<BDListaElemento> v = tmp.getLista(); if(v != null){ if(v.size() != 0){ //verificar itens de v for(int i=0;i<v.size();i++){ BDListaElemento bdl = (BDListaElemento) v.get(i); if(bdl.tipo.equals("NSA")){ if(verificarLista(bdl.id) != -1){ //adicionar id nsa na lista lista.add(bdl.id); //desmontar DesmontadorNSA dnsa = new DesmontadorNSA(nucleo, bdl.id, lista, fila); if(dnsa.desmontar() == false){ res = false; break; } //remover id nsa da lista lista.remove(verificarLista(bdl.id)); } }else{ //NPA, colocar na fila NPA novo = nucleo.getControleBD().consultaNPA(bdl.id); if(novo != null){ //adicionar na fila cmd = novo.getCmd(); fila.adicionar(cmd); }else{ res = false; } } if(res == false) break; } }else{ res = false; } }else{ res = false; } } return res; //se true, é válido } ValidadorNSA.java 1 /* 2 * ValidadorNSA.java 3 */ 4 5 package ar.controle.bd; 6 7 import ar.nucleo.*; 8 import ar.informacao.*; 37 9 import java.util.Vector; 10 /** 11 * 12 * @author Leonardo Torati 13 */ 14 public class ValidadorNSA { 15 Nucleo nucleo; 16 Vector lista; 17 ControleBD cbd; 18 String id; 19 20 public ValidadorNSA(Nucleo n, String ID, Vector l) { 21 nucleo = n; 22 cbd = n.getControleBD(); 23 lista = l; 24 id = ID; 25 26 } 27 28 private int verificarLista(String ID){ 29 int res = -1; 30 String str; 31 32 for(int i = 0; i<lista.size(); i++){ 33 str = (String) lista.get(i); 34 if(str.equals(ID)){ 35 res = i; 36 } 37 } 38 39 return res; //se > -1: encontrou na lista 40 } 41 42 public boolean validar(){ 43 boolean res = true; 44 45 NSA tmp = cbd.consultaNSA(id); 46 if(tmp != null){ 47 Vector<BDListaElemento> v = tmp.getLista(); 48 if(v != null){ 49 if(v.size() != 0){ 50 //verificar itens de v 51 for(int i=0;i<v.size();i++){ 52 BDListaElemento bdl = (BDListaElemento) v.get(i); 53 if(bdl.tipo == "NSA"){ 54 if(verificarLista(bdl.id) != -1){ 55 //adicionar id nsa na lista 56 lista.add(bdl.id); 57 //desmontar 58 ValidadorNSA dnsa = new ValidadorNSA(nucleo, bdl.id, lista); 59 if(dnsa.validar() == false){ 60 res = false; 61 break; 62 } 63 //remover id nsa da lista 64 lista.remove(verificarLista(bdl.id)); 65 } 66 } 38 67 68 69 70 71 72 73 74 75 76 77 } } }else{ res = false; } }else{ res = false; } } } return res; //se true, é válido 39 PACOTE: ar.interacao Config.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 /* * Config.java */ package ar.interacao; import ar.nucleo.*; import java.io.*; import ar.informacao.ValorMotores; /** * * @author Leonardo Torati */ public class Config extends javax.swing.JFrame { private Nucleo nucleo; private Parametros p; private ValorMotores vm; //====PARÂMETROS====================================================== ====== /** * */ public Config(Nucleo n) { nucleo = n; p = n.getParametros(); initComponents(); } /** * */ public void carregarParametros(){ vm = p.getIni(); sldA.setValue(vm.a); sldB.setValue(vm.b); sldC.setValue(vm.c); sldD.setValue(vm.d); sldE.setValue(vm.e); sldF.setValue(vm.f); sldG.setValue(vm.g); sldH.setValue(vm.h); tfTempoDelay.setText("" + p.getTempoDelay()); tfDelayMax.setText("" + p.getDelayMax()); String l="", s="", arq = ""; l = p.getLogin(); 40 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 } s = p.getSenha(); tfLogin.setText(l); pfSenha.setText(s); arq = p.getArquivo(); tfArquivo.setText(arq); tfPortaSerial.setText(p.getPortaSerial()); public Parametros salvarParametros(){ Parametros p = nucleo.getParametros(); vm.a vm.b vm.c vm.d vm.e vm.f vm.g vm.h = = = = = = = = sldA.getValue(); sldB.getValue(); sldC.getValue(); sldD.getValue(); sldE.getValue(); sldF.getValue(); sldG.getValue(); sldH.getValue(); p.setIni(vm); p.setDelayMax(Integer.parseInt(tfDelayMax.getText())); p.setTempoDelay(Integer.parseInt(tfTempoDelay.getText())); p.setLogin(tfLogin.getText()); p.setSenha(pfSenha.getText()); p.setArquivo(tfArquivo.getText()); p.setPortaSerial(tfPortaSerial.getText()); } return p; /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); tfA = new javax.swing.JTextField(); sldA = new javax.swing.JSlider(); jLabel2 = new javax.swing.JLabel(); tfB = new javax.swing.JTextField(); sldB = new javax.swing.JSlider(); jLabel3 = new javax.swing.JLabel(); tfC = new javax.swing.JTextField(); sldC = new javax.swing.JSlider(); jLabel4 = new javax.swing.JLabel(); tfD = new javax.swing.JTextField(); sldD = new javax.swing.JSlider(); jLabel5 = new javax.swing.JLabel(); tfE = new javax.swing.JTextField(); sldE = new javax.swing.JSlider(); jLabel6 = new javax.swing.JLabel(); 41 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 tfF = new javax.swing.JTextField(); sldF = new javax.swing.JSlider(); jLabel7 = new javax.swing.JLabel(); tfG = new javax.swing.JTextField(); sldG = new javax.swing.JSlider(); jLabel8 = new javax.swing.JLabel(); tfH = new javax.swing.JTextField(); sldH = new javax.swing.JSlider(); jPanel3 = new javax.swing.JPanel(); jLabel9 = new javax.swing.JLabel(); tfTempoDelay = new javax.swing.JTextField(); jLabel10 = new javax.swing.JLabel(); tfDelayMax = new javax.swing.JTextField(); jLabel11 = new javax.swing.JLabel(); tfPortaSerial = new javax.swing.JTextField(); btSalvar = new javax.swing.JButton(); btCancelar = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); jLabel14 = new javax.swing.JLabel(); tfLogin = new javax.swing.JTextField(); jLabel15 = new javax.swing.JLabel(); pfSenha = new javax.swing.JPasswordField(); jLabel12 = new javax.swing.JLabel(); tfArquivo = new javax.swing.JTextField(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); setTitle("Configura\u00e7\u00e3o"); setResizable(false); jPanel1.setLayout(null); jPanel1.setPreferredSize(new java.awt.Dimension(490, 300)); jPanel2.setLayout(new java.awt.GridLayout(8, 3)); jPanel2.setBorder(new javax.swing.border.TitledBorder("Inicializa\u00e7\u00e3o")); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel1.setText("Motor A: "); jPanel2.add(jLabel1); tfA.setEditable(false); tfA.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfA.setText("64"); jPanel2.add(tfA); sldA.setMaximum(130); sldA.setMinimum(1); sldA.setValue(64); sldA.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldAStateChanged(evt); } }); jPanel2.add(sldA); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); 42 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 jLabel2.setText("Motor B: "); jPanel2.add(jLabel2); tfB.setEditable(false); tfB.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfB.setText("64"); jPanel2.add(tfB); sldB.setMaximum(130); sldB.setMinimum(1); sldB.setValue(64); sldB.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldBStateChanged(evt); } }); jPanel2.add(sldB); jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel3.setText(" Motor C: "); jPanel2.add(jLabel3); tfC.setEditable(false); tfC.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfC.setText("64"); jPanel2.add(tfC); sldC.setMaximum(130); sldC.setMinimum(1); sldC.setValue(64); sldC.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldCStateChanged(evt); } }); jPanel2.add(sldC); jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel4.setText("Motor D: "); jPanel2.add(jLabel4); tfD.setEditable(false); tfD.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfD.setText("64"); jPanel2.add(tfD); sldD.setMaximum(130); sldD.setMinimum(1); sldD.setValue(64); sldD.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldDStateChanged(evt); } }); jPanel2.add(sldD); 43 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel5.setText("Motor E: "); jPanel2.add(jLabel5); tfE.setEditable(false); tfE.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfE.setText("64"); jPanel2.add(tfE); sldE.setMaximum(130); sldE.setMinimum(1); sldE.setValue(64); sldE.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldEStateChanged(evt); } }); jPanel2.add(sldE); jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel6.setText("Motor F: "); jPanel2.add(jLabel6); tfF.setEditable(false); tfF.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfF.setText("64"); jPanel2.add(tfF); sldF.setMaximum(130); sldF.setMinimum(1); sldF.setValue(64); sldF.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldFStateChanged(evt); } }); jPanel2.add(sldF); jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel7.setText("Motor G: "); jPanel2.add(jLabel7); tfG.setEditable(false); tfG.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfG.setText("64"); jPanel2.add(tfG); sldG.setMaximum(130); sldG.setMinimum(1); sldG.setValue(64); sldG.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldGStateChanged(evt); } }); 44 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 jPanel2.add(sldG); jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel8.setText("Motor H: "); jPanel2.add(jLabel8); tfH.setEditable(false); tfH.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfH.setText("64"); jPanel2.add(tfH); sldH.setMaximum(130); sldH.setMinimum(1); sldH.setValue(64); sldH.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldHStateChanged(evt); } }); jPanel2.add(sldH); jPanel1.add(jPanel2); jPanel2.setBounds(10, 10, 235, 280); jPanel3.setLayout(new java.awt.GridLayout(3, 2)); jPanel3.setBorder(new javax.swing.border.TitledBorder("Par\u00e2metros")); jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel9.setText("Tempo de Delay: "); jPanel3.add(jLabel9); tfTempoDelay.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfTempoDelay.setText("500"); jPanel3.add(tfTempoDelay); jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jPanel3.add(jLabel10); tfDelayMax.setBackground(java.awt.SystemColor.control); tfDelayMax.setEditable(false); tfDelayMax.setForeground(java.awt.SystemColor.control); tfDelayMax.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfDelayMax.setText("750"); jPanel3.add(tfDelayMax); jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel11.setText(" "); jPanel3.add(jLabel11); tfPortaSerial.setBackground(java.awt.SystemColor.control); tfPortaSerial.setEditable(false); tfPortaSerial.setForeground(java.awt.SystemColor.control); tfPortaSerial.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfPortaSerial.setText("COM1"); 45 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 jPanel3.add(tfPortaSerial); jPanel1.add(jPanel3); jPanel3.setBounds(250, 10, 235, 125); btSalvar.setText("Salvar"); btSalvar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btSalvarActionPerformed(evt); } }); jPanel1.add(btSalvar); btSalvar.setBounds(250, 255, 110, 30); btCancelar.setText("Cancelar"); btCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btCancelarActionPerformed(evt); } }); jPanel1.add(btCancelar); btCancelar.setBounds(370, 255, 110, 30); jPanel4.setLayout(new java.awt.GridLayout(3, 2)); jPanel4.setBorder(new javax.swing.border.TitledBorder("Banco de Dados")); jLabel14.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel14.setText("Login: "); jPanel4.add(jLabel14); tfLogin.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfLogin.setText("sysdba"); jPanel4.add(tfLogin); jLabel15.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel15.setText("Senha: "); jPanel4.add(jLabel15); pfSenha.setHorizontalAlignment(javax.swing.JTextField.CENTER); pfSenha.setText("masterkey"); jPanel4.add(pfSenha); jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel12.setText("Arquivo: "); jPanel4.add(jLabel12); tfArquivo.setHorizontalAlignment(javax.swing.JTextField.CENTER); jPanel4.add(tfArquivo); jPanel1.add(jPanel4); jPanel4.setBounds(250, 140, 235, 110); getContentPane().add(jPanel1); pack(); 46 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 } // </editor-fold> private void sldHStateChanged(javax.swing.event.ChangeEvent evt) { tfH.setText(sldH.getValue() + ""); } private void sldGStateChanged(javax.swing.event.ChangeEvent evt) { tfG.setText(sldG.getValue() + ""); } private void sldFStateChanged(javax.swing.event.ChangeEvent evt) { tfF.setText(sldF.getValue() + ""); } private void sldEStateChanged(javax.swing.event.ChangeEvent evt) { tfE.setText(sldE.getValue() + ""); } private void sldDStateChanged(javax.swing.event.ChangeEvent evt) { tfD.setText(sldD.getValue() + ""); } private void sldCStateChanged(javax.swing.event.ChangeEvent evt) { tfC.setText(sldC.getValue() + ""); } private void sldBStateChanged(javax.swing.event.ChangeEvent evt) { tfB.setText(sldB.getValue() + ""); } private void sldAStateChanged(javax.swing.event.ChangeEvent evt) { tfA.setText(sldA.getValue() + ""); } private void btCancelarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) { Parametros pa = salvarParametros(); nucleo.setParametros(pa); nucleo.salvarParametros(); this.setVisible(false); } // Variables declaration - do not modify private javax.swing.JButton btCancelar; private javax.swing.JButton btSalvar; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12; private javax.swing.JLabel jLabel14; private javax.swing.JLabel jLabel15; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; 47 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 } private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPasswordField pfSenha; private javax.swing.JSlider sldA; private javax.swing.JSlider sldB; private javax.swing.JSlider sldC; private javax.swing.JSlider sldD; private javax.swing.JSlider sldE; private javax.swing.JSlider sldF; private javax.swing.JSlider sldG; private javax.swing.JSlider sldH; private javax.swing.JTextField tfA; private javax.swing.JTextField tfArquivo; private javax.swing.JTextField tfB; private javax.swing.JTextField tfC; private javax.swing.JTextField tfD; private javax.swing.JTextField tfDelayMax; private javax.swing.JTextField tfE; private javax.swing.JTextField tfF; private javax.swing.JTextField tfG; private javax.swing.JTextField tfH; private javax.swing.JTextField tfLogin; private javax.swing.JTextField tfPortaSerial; private javax.swing.JTextField tfTempoDelay; // End of variables declaration Principal.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* * Principal.java */ package ar.interacao; import import import import import import ar.nucleo.*; ar.interacao.*; java.util.Vector; ar.informacao.*; java.io.File; ar.controle.SerialCMDE; /** * * @author Leonardo Torati */ public class Principal extends javax.swing.JFrame { private Nucleo nucleo; private Config config; 48 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 private Vector<String> vExecucao; public Principal() { initComponents(); vExecucao = new Vector<String>(); nucleo = new Nucleo(jtxtLog, lstNSA, lstProcessados); config = new Config(nucleo); //posição inicial nucleo.msg("Posição inicial..."); ValorMotores vm = nucleo.getParametros().getIni(); Comando cmd = new Comando(); Motor motor; int valor; valor = vm.a; motor = new Motor("A", valor, 0); cmd.n.adicionar(motor); valor = vm.b; motor = new Motor("B", valor, 0); cmd.n.adicionar(motor); valor = vm.c; motor = new Motor("C", valor, 0); cmd.s.adicionar(motor); valor = vm.d; motor = new Motor("D", valor, 0); cmd.s.adicionar(motor); valor = vm.e; motor = new Motor("E", valor, 0); cmd.l.adicionar(motor); valor = vm.f; motor = new Motor("F", valor, 0); cmd.l.adicionar(motor); valor = vm.g; motor = new Motor("G", valor, 0); cmd.o.adicionar(motor); valor = vm.h; motor = new Motor("H", valor, 0); cmd.o.adicionar(motor); nucleo.visualizar(cmd); nucleo.atualizarNSA(); nucleo.msg("ARc Iniciado."); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. 49 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lstNSA = new javax.swing.JList(); jPanel3 = new javax.swing.JPanel(); jPanel4 = new javax.swing.JPanel(); btNPA = new javax.swing.JButton(); btNSA = new javax.swing.JButton(); jPanel5 = new javax.swing.JPanel(); tfNSA = new javax.swing.JTextField(); btProcessar = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); jPanel6 = new javax.swing.JPanel(); jPanel7 = new javax.swing.JPanel(); btLimpar = new javax.swing.JButton(); btSair = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); jtxtLog = new javax.swing.JTextArea(); jPanel8 = new javax.swing.JPanel(); jScrollPane3 = new javax.swing.JScrollPane(); lstProcessados = new javax.swing.JList(); jPanel9 = new javax.swing.JPanel(); jPanel10 = new javax.swing.JPanel(); btExcluir = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); btAdicionar = new javax.swing.JButton(); btRemover = new javax.swing.JButton(); btExecutar = new javax.swing.JButton(); jScrollPane4 = new javax.swing.JScrollPane(); lstExecucao = new javax.swing.JList(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setTitle("ARc - Sistema de Controle do AR+"); setName("Principal"); setResizable(false); jPanel1.setLayout(null); jPanel1.setBackground(new java.awt.Color(255, 255, 255)); jPanel1.setPreferredSize(new java.awt.Dimension(700, 330)); jPanel2.setLayout(new java.awt.GridLayout(1, 2)); jPanel2.setBackground(new java.awt.Color(255, 255, 255)); jPanel2.setBorder(new javax.swing.border.EtchedBorder()); jScrollPane1.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1))); lstNSA.setBorder(new javax.swing.border.TitledBorder("NSAs")); lstNSA.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { 50 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 lstNSAValueChanged(evt); }); } jScrollPane1.setViewportView(lstNSA); jPanel2.add(jScrollPane1); jPanel3.setLayout(new java.awt.GridLayout(2, 1)); jPanel3.setBackground(new java.awt.Color(255, 255, 255)); jPanel4.setLayout(new java.awt.GridLayout(2, 1)); jPanel4.setBackground(new java.awt.Color(255, 255, 255)); btNPA.setText("NPA"); btNPA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btNPAActionPerformed(evt); } }); jPanel4.add(btNPA); btNSA.setText("NSA"); btNSA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btNSAActionPerformed(evt); } }); jPanel4.add(btNSA); jPanel3.add(jPanel4); jPanel5.setLayout(new java.awt.GridLayout(3, 1)); jPanel5.setBackground(new java.awt.Color(255, 255, 255)); jPanel5.setBorder(new javax.swing.border.EtchedBorder()); tfNSA.setEditable(false); tfNSA.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfNSA.setText("Selecione um NSA"); jPanel5.add(tfNSA); btProcessar.setText("Processar"); btProcessar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btProcessarActionPerformed(evt); } }); jPanel5.add(btProcessar); jButton4.setText("Configura\u00e7\u00f5es"); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); 51 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 jPanel5.add(jButton4); jPanel3.add(jPanel5); jPanel2.add(jPanel3); jPanel1.add(jPanel2); jPanel2.setBounds(10, 10, 350, 210); jPanel6.setLayout(new java.awt.BorderLayout()); jPanel6.setBackground(new java.awt.Color(255, 255, 255)); jPanel6.setBorder(new javax.swing.border.EtchedBorder()); jPanel7.setLayout(new java.awt.GridLayout(2, 1)); jPanel7.setBackground(new java.awt.Color(255, 255, 255)); btLimpar.setText("Limpar"); btLimpar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btLimparActionPerformed(evt); } }); jPanel7.add(btLimpar); btSair.setText("Sair"); btSair.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btSairActionPerformed(evt); } }); jPanel7.add(btSair); jPanel6.add(jPanel7, java.awt.BorderLayout.EAST); jScrollPane2.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1))); jtxtLog.setEditable(false); jtxtLog.setText("LOG de execu\u00e7\u00e3o."); jScrollPane2.setViewportView(jtxtLog); jPanel6.add(jScrollPane2, java.awt.BorderLayout.CENTER); jPanel1.add(jPanel6); jPanel6.setBounds(10, 230, 350, 80); jPanel8.setLayout(new java.awt.GridLayout(1, 2)); jPanel8.setBackground(new java.awt.Color(255, 255, 255)); jPanel8.setBorder(new javax.swing.border.EtchedBorder()); jPanel8.setPreferredSize(new java.awt.Dimension(520, 420)); jScrollPane3.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane3.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1))); lstProcessados.setBorder(new javax.swing.border.TitledBorder("NSAs Processados")); 52 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 jScrollPane3.setViewportView(lstProcessados); jPanel8.add(jScrollPane3); jPanel9.setLayout(new java.awt.GridLayout(2, 0)); jPanel9.setBackground(new java.awt.Color(255, 255, 255)); jPanel10.setLayout(new java.awt.GridLayout(5, 0)); jPanel10.setBackground(new java.awt.Color(255, 255, 255)); btExcluir.setText("Excluir"); btExcluir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btExcluirActionPerformed(evt); } }); jPanel10.add(btExcluir); jPanel10.add(jLabel1); btAdicionar.setText("Adicionar"); btAdicionar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btAdicionarActionPerformed(evt); } }); jPanel10.add(btAdicionar); btRemover.setText("Remover"); btRemover.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btRemoverActionPerformed(evt); } }); jPanel10.add(btRemover); btExecutar.setText("Executar"); btExecutar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btExecutarActionPerformed(evt); } }); jPanel10.add(btExecutar); jPanel9.add(jPanel10); jScrollPane4.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane4.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1))); lstExecucao.setBorder(new javax.swing.border.TitledBorder("Lista de Execu\u00e7\u00e3o")); jScrollPane4.setViewportView(lstExecucao); jPanel9.add(jScrollPane4); 53 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 jPanel8.add(jPanel9); jPanel1.add(jPanel8); jPanel8.setBounds(365, 10, 315, 300); getContentPane().add(jPanel1); pack(); } // </editor-fold> private void btExecutarActionPerformed(java.awt.event.ActionEvent evt) { if(vExecucao.size() > 0){ FilaComandoEscalonado fcmde = new FilaComandoEscalonado(); ComandoEscalonado cmde = null; String id; File file; SerialCMDE scmde = new SerialCMDE(); int cont = vExecucao.size(); for(int i=0;i<cont;i++){ //percorrer itens para executar id = (String) vExecucao.get(i); } //consultar nsap if(nucleo.getControleBD().consultaNSAProcessado(id) == true){ //deserializar cmde cmde = scmde.deSerializar(id); if(cmde != null){ fcmde.adicionar(cmde); } } nucleo.transmitir(fcmde); } } vExecucao.clear(); lstExecucao.setListData(vExecucao); private void btRemoverActionPerformed(java.awt.event.ActionEvent evt) { if(lstExecucao.getSelectedValue() != null){ vExecucao.remove(lstExecucao.getSelectedValue()); lstExecucao.setListData(vExecucao); } } private void btAdicionarActionPerformed(java.awt.event.ActionEvent evt) { if(lstProcessados.getSelectedValue() != null){ vExecucao.add((String) lstProcessados.getSelectedValue()); lstExecucao.setListData(vExecucao); } } private void btExcluirActionPerformed(java.awt.event.ActionEvent evt) { if(lstProcessados.getSelectedValue() != null){ String id = (String) lstProcessados.getSelectedValue(); 54 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 nucleo.getControleBD().excluirNSAProcessado(id); lstProcessados.setListData(nucleo.getControleBD().listaNSAProcessado()); } } private void btNPAActionPerformed(java.awt.event.ActionEvent evt) { nucleo.getTelaNPA().limpar(); nucleo.getTelaNPA().setVisible(true); } private void lstNSAValueChanged(javax.swing.event.ListSelectionEvent evt) { tfNSA.setText((String) lstNSA.getSelectedValue()); } private void btNSAActionPerformed(java.awt.event.ActionEvent evt) { Vector<String> v = nucleo.getControleBD().listaNSA(); nucleo.getTelaNSA().listarNSA(v); v = nucleo.getControleBD().listaNPA(); nucleo.getTelaNSA().listarNPA(v); nucleo.getTelaNSA().atualizarListas(); nucleo.getTelaNSA().setVisible(true); } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { config.carregarParametros(); config.setVisible(true); } private void btSairActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } private void btLimparActionPerformed(java.awt.event.ActionEvent evt) { nucleo.limparLog(); } private void btProcessarActionPerformed(java.awt.event.ActionEvent evt) { String tmp = (String) lstNSA.getSelectedValue(); if(tmp != null){ nucleo.executarNSA(tmp); } nucleo.atualizarNSA(); } // Variables declaration - do not modify private javax.swing.JButton btAdicionar; private javax.swing.JButton btExcluir; private javax.swing.JButton btExecutar; private javax.swing.JButton btLimpar; private javax.swing.JButton btNPA; private javax.swing.JButton btNSA; private javax.swing.JButton btProcessar; private javax.swing.JButton btRemover; private javax.swing.JButton btSair; private javax.swing.JButton jButton4; private javax.swing.JLabel jLabel1; 55 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 } private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel10; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel7; private javax.swing.JPanel jPanel8; private javax.swing.JPanel jPanel9; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JTextArea jtxtLog; private javax.swing.JList lstExecucao; private javax.swing.JList lstNSA; private javax.swing.JList lstProcessados; private javax.swing.JTextField tfNSA; // End of variables declaration Splash.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 /* * Splash.java */ package ar.interacao; /** * * @author Leonardo Torati */ public class Splash extends javax.swing.JFrame { /** * */ public Splash() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); lblA = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); 56 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 } setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("ARc Beta 1"); setAlwaysOnTop(true); setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); setLocationByPlatform(true); setName("Inicio"); setResizable(false); setUndecorated(true); jPanel1.setLayout(null); jPanel1.setBackground(new java.awt.Color(255, 255, 255)); jPanel1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.RAISED)); jPanel1.setPreferredSize(new java.awt.Dimension(300, 190)); jPanel2.setLayout(new java.awt.GridLayout(1, 0)); jPanel2.setBorder(new javax.swing.border.EtchedBorder()); lblA.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblA.setText("Iniciando..."); jPanel2.add(lblA); jPanel1.add(jPanel2); jPanel2.setBounds(10, 150, 280, 30); jLabel2.setBackground(new java.awt.Color(255, 255, 255)); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ar/interacao/logo.jpg"))); jPanel1.add(jLabel2); jLabel2.setBounds(10, 10, 280, 130); getContentPane().add(jPanel1); pack(); } // </editor-fold> /** * */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Splash().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JLabel lblA; // End of variables declaration 57 TalaAguarde.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 /* * TelaAguarde.java */ package ar.interacao; /** * * @author Leonardo Torati */ public class TelaAguarde extends javax.swing.JFrame { /** * */ public TelaAguarde() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); setTitle("Aguarde"); setAlwaysOnTop(true); setFocusableWindowState(false); setFont(new java.awt.Font("Agency FB", 0, 10)); setLocationByPlatform(true); setName("Aguarde"); setResizable(false); setUndecorated(true); jPanel1.setLayout(new java.awt.GridLayout(1, 0)); jPanel1.setBackground(new java.awt.Color(255, 255, 255)); jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(255, 0, 0), 2)); jPanel1.setPreferredSize(new java.awt.Dimension(200, 50)); jLabel1.setFont(new java.awt.Font("Microsoft Sans Serif", 1, 12)); jLabel1.setForeground(new java.awt.Color(255, 51, 0)); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText("AGUARDE..."); jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jPanel1.add(jLabel1); getContentPane().add(jPanel1); pack(); } 58 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 } // </editor-fold> /** * */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new TelaAguarde().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; // End of variables declaration TelaNPA.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* * TelaNPA.java */ package ar.interacao; import import import import import ar.informacao.*; ar.informacao.NPA; java.util.Vector; ar.nucleo.*; ar.controle.bd.*; /** * * @author Leonardo Torati */ public class TelaNPA extends javax.swing.JFrame { private private private private FilaMotor n, s, l, o; Vector<Motor> a, b, c, d, e, f, g, h; Nucleo nucleo; Parametros p; public TelaNPA(Nucleo nu) { initComponents(); nucleo = nu; p = nu.getParametros(); carregarMotores(); //incializar n = new FilaMotor("N"); s = new FilaMotor("S"); 59 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 l = new FilaMotor("L"); o = new FilaMotor("O"); } a b c d e f g h = = = = = = = = new new new new new new new new Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); Vector<Motor>(); private void carregarMotores(){ ValorMotores vm; //carrear motores vm = p.getIni(); tfNA.setText("" + vm.a); sldNA.setValue(vm.a); tfNB.setText("" + vm.b); sldNB.setValue(vm.b); tfSA.setText("" + vm.c); sldSA.setValue(vm.c); tfSB.setText("" + vm.d); sldSB.setValue(vm.d); tfLA.setText("" + vm.e); sldLA.setValue(vm.e); tfLB.setText("" + vm.f); sldLB.setValue(vm.f); tfOA.setText("" + vm.g); sldOA.setValue(vm.g); } tfOB.setText("" + vm.h); sldOB.setValue(vm.h); /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel2 = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel(); sldNA = new javax.swing.JSlider(); jPanel7 = new javax.swing.JPanel(); jLabel12 = new javax.swing.JLabel(); tfNA = new javax.swing.JTextField(); sldSA = new javax.swing.JSlider(); 60 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 jPanel8 = new javax.swing.JPanel(); jLabel10 = new javax.swing.JLabel(); tfSA = new javax.swing.JTextField(); sldLA = new javax.swing.JSlider(); jPanel9 = new javax.swing.JPanel(); jLabel8 = new javax.swing.JLabel(); tfLA = new javax.swing.JTextField(); sldOA = new javax.swing.JSlider(); jPanel10 = new javax.swing.JPanel(); jLabel7 = new javax.swing.JLabel(); tfOA = new javax.swing.JTextField(); sldNB = new javax.swing.JSlider(); jPanel11 = new javax.swing.JPanel(); jLabel13 = new javax.swing.JLabel(); tfNB = new javax.swing.JTextField(); sldSB = new javax.swing.JSlider(); jPanel12 = new javax.swing.JPanel(); jLabel11 = new javax.swing.JLabel(); tfSB = new javax.swing.JTextField(); sldLB = new javax.swing.JSlider(); jPanel13 = new javax.swing.JPanel(); jLabel9 = new javax.swing.JLabel(); tfLB = new javax.swing.JTextField(); sldOB = new javax.swing.JSlider(); jPanel14 = new javax.swing.JPanel(); jLabel6 = new javax.swing.JLabel(); tfOB = new javax.swing.JTextField(); jPanel3 = new javax.swing.JPanel(); btAdd = new javax.swing.JButton(); btResetar = new javax.swing.JButton(); btVisualizar = new javax.swing.JButton(); btEditar = new javax.swing.JButton(); btLimpar = new javax.swing.JButton(); btRemover = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); jLabel14 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jlstA = new javax.swing.JList(); jLabel15 = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); jlstB = new javax.swing.JList(); jLabel16 = new javax.swing.JLabel(); jScrollPane3 = new javax.swing.JScrollPane(); jlstC = new javax.swing.JList(); jLabel17 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); jlstD = new javax.swing.JList(); jLabel18 = new javax.swing.JLabel(); jScrollPane5 = new javax.swing.JScrollPane(); jlstE = new javax.swing.JList(); jLabel19 = new javax.swing.JLabel(); jScrollPane6 = new javax.swing.JScrollPane(); jlstF = new javax.swing.JList(); jLabel20 = new javax.swing.JLabel(); jScrollPane7 = new javax.swing.JScrollPane(); jlstG = new javax.swing.JList(); 61 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 jLabel21 = new javax.swing.JLabel(); jScrollPane8 = new javax.swing.JScrollPane(); jlstH = new javax.swing.JList(); jPanel5 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); tfNome = new javax.swing.JTextField(); btSalvar = new javax.swing.JButton(); btCancelar = new javax.swing.JButton(); jPanel6 = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); setTitle("Edi\u00e7\u00e3o de NPA"); setName("NPA"); setResizable(false); jPanel2.setLayout(null); jPanel2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED) ); 172 jPanel2.setPreferredSize(new java.awt.Dimension(540, 400)); 173 jPanel1.setLayout(new java.awt.GridLayout(2, 8)); 174 175 jPanel1.setBorder(new javax.swing.border.EtchedBorder()); 176 sldNA.setMajorTickSpacing(10); 177 sldNA.setMaximum(130); 178 sldNA.setMinimum(1); 179 sldNA.setMinorTickSpacing(1); 180 sldNA.setOrientation(javax.swing.JSlider.VERTICAL); 181 sldNA.setValue(64); 182 sldNA.addChangeListener(new javax.swing.event.ChangeListener() { 183 public void stateChanged(javax.swing.event.ChangeEvent evt) { 184 sldNAStateChanged(evt); 185 } 186 }); 187 188 jPanel1.add(sldNA); 189 190 jPanel7.setLayout(new java.awt.GridLayout(2, 0)); 191 192 jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 193 jLabel12.setText("A"); 194 jLabel12.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); 195 jPanel7.add(jLabel12); 196 197 tfNA.setEditable(false); 198 tfNA.setHorizontalAlignment(javax.swing.JTextField.CENTER); 199 tfNA.setText("64"); 200 tfNA.setDisabledTextColor(new java.awt.Color(0, 0, 0)); 201 jPanel7.add(tfNA); 202 203 jPanel1.add(jPanel7); 204 62 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 sldSA.setMajorTickSpacing(10); sldSA.setMaximum(130); sldSA.setMinimum(1); sldSA.setMinorTickSpacing(1); sldSA.setOrientation(javax.swing.JSlider.VERTICAL); sldSA.setValue(64); sldSA.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldSAStateChanged(evt); } }); jPanel1.add(sldSA); jPanel8.setLayout(new java.awt.GridLayout(2, 0)); jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel10.setText("C"); jLabel10.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel8.add(jLabel10); tfSA.setEditable(false); tfSA.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfSA.setText("64"); tfSA.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel8.add(tfSA); jPanel1.add(jPanel8); sldLA.setMajorTickSpacing(10); sldLA.setMaximum(130); sldLA.setMinimum(1); sldLA.setMinorTickSpacing(1); sldLA.setOrientation(javax.swing.JSlider.VERTICAL); sldLA.setValue(64); sldLA.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldLAStateChanged(evt); } }); jPanel1.add(sldLA); jPanel9.setLayout(new java.awt.GridLayout(2, 0)); jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel8.setText("E"); jLabel8.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel9.add(jLabel8); tfLA.setEditable(false); tfLA.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfLA.setText("64"); tfLA.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel9.add(tfLA); jPanel1.add(jPanel9); 63 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 sldOA.setMajorTickSpacing(10); sldOA.setMaximum(130); sldOA.setMinimum(1); sldOA.setMinorTickSpacing(1); sldOA.setOrientation(javax.swing.JSlider.VERTICAL); sldOA.setValue(64); sldOA.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldOAStateChanged(evt); } }); jPanel1.add(sldOA); jPanel10.setLayout(new java.awt.GridLayout(2, 0)); jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel7.setText("G"); jLabel7.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel10.add(jLabel7); tfOA.setEditable(false); tfOA.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfOA.setText("64"); tfOA.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel10.add(tfOA); jPanel1.add(jPanel10); sldNB.setMajorTickSpacing(10); sldNB.setMaximum(130); sldNB.setMinimum(1); sldNB.setMinorTickSpacing(1); sldNB.setOrientation(javax.swing.JSlider.VERTICAL); sldNB.setValue(64); sldNB.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldNBStateChanged(evt); } }); jPanel1.add(sldNB); jPanel11.setLayout(new java.awt.GridLayout(2, 0)); jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel13.setText("B"); jLabel13.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel11.add(jLabel13); tfNB.setEditable(false); tfNB.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfNB.setText("64"); tfNB.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel11.add(tfNB); jPanel1.add(jPanel11); 64 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 sldSB.setMajorTickSpacing(10); sldSB.setMaximum(130); sldSB.setMinimum(1); sldSB.setMinorTickSpacing(1); sldSB.setOrientation(javax.swing.JSlider.VERTICAL); sldSB.setValue(64); sldSB.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldSBStateChanged(evt); } }); jPanel1.add(sldSB); jPanel12.setLayout(new java.awt.GridLayout(2, 0)); jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel11.setText("D"); jLabel11.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel12.add(jLabel11); tfSB.setEditable(false); tfSB.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfSB.setText("64"); tfSB.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel12.add(tfSB); jPanel1.add(jPanel12); sldLB.setMajorTickSpacing(10); sldLB.setMaximum(130); sldLB.setMinimum(1); sldLB.setMinorTickSpacing(1); sldLB.setOrientation(javax.swing.JSlider.VERTICAL); sldLB.setValue(64); sldLB.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldLBStateChanged(evt); } }); jPanel1.add(sldLB); jPanel13.setLayout(new java.awt.GridLayout(2, 0)); jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel9.setText("F"); jLabel9.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel13.add(jLabel9); tfLB.setEditable(false); tfLB.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfLB.setText("64"); tfLB.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel13.add(tfLB); jPanel1.add(jPanel13); 65 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 sldOB.setMajorTickSpacing(10); sldOB.setMaximum(130); sldOB.setMinimum(1); sldOB.setMinorTickSpacing(1); sldOB.setOrientation(javax.swing.JSlider.VERTICAL); sldOB.setValue(64); sldOB.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldOBStateChanged(evt); } }); jPanel1.add(sldOB); jPanel14.setLayout(new java.awt.GridLayout(2, 0)); jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel6.setText("H"); jLabel6.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); jPanel14.add(jLabel6); tfOB.setEditable(false); tfOB.setHorizontalAlignment(javax.swing.JTextField.CENTER); tfOB.setText("64"); tfOB.setDisabledTextColor(new java.awt.Color(0, 0, 0)); jPanel14.add(tfOB); jPanel1.add(jPanel14); jPanel2.add(jPanel1); jPanel1.setBounds(10, 40, 250, 270); jPanel3.setLayout(new java.awt.GridLayout(1, 6)); jPanel3.setBorder(new javax.swing.border.EtchedBorder()); btAdd.setText("ADD"); btAdd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btAddActionPerformed(evt); } }); jPanel3.add(btAdd); btResetar.setText("Resetar"); btResetar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btResetarActionPerformed(evt); } }); jPanel3.add(btResetar); btVisualizar.setText("Visualizar"); btVisualizar.setToolTipText("Visualiza a posi\u00e7\u00e3o atual no rob\u00f4"); 434 btVisualizar.addActionListener(new java.awt.event.ActionListener() { 435 public void actionPerformed(java.awt.event.ActionEvent evt) { 66 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 btVisualizarActionPerformed(evt); }); } jPanel3.add(btVisualizar); btEditar.setText("Editar"); btEditar.setToolTipText("Salva os valores atuais no item selecionado"); btEditar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btEditarActionPerformed(evt); } }); jPanel3.add(btEditar); btLimpar.setText("Limpar"); btLimpar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btLimparActionPerformed(evt); } }); jPanel3.add(btLimpar); btRemover.setText("Remover"); btRemover.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btRemoverActionPerformed(evt); } }); jPanel3.add(btRemover); jPanel2.add(jPanel3); jPanel3.setBounds(10, 310, 520, 40); jPanel4.setLayout(new java.awt.GridLayout(8, 2)); jPanel4.setBorder(new javax.swing.border.EtchedBorder()); jLabel14.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel14.setText("Motor A: "); jPanel4.add(jLabel14); jlstA.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstA.addListSelectionListener(new javax.swing.event.ListSelectionListener() { 489 public void valueChanged(javax.swing.event.ListSelectionEvent evt) { 490 jlstAValueChanged(evt); 67 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 } }); jlstA.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane1.setViewportView(jlstA); jPanel4.add(jScrollPane1); jLabel15.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel15.setText("Motor B: "); jPanel4.add(jLabel15); jlstB.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstB.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jlstAValueChanged(evt); } }); jlstB.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane2.setViewportView(jlstB); jPanel4.add(jScrollPane2); jLabel16.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel16.setText("Motor C: "); jPanel4.add(jLabel16); jlstC.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstC.addListSelectionListener(new javax.swing.event.ListSelectionListener() { 543 public void valueChanged(javax.swing.event.ListSelectionEvent evt) { 544 jlstAValueChanged(evt); 68 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 } }); jlstC.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane3.setViewportView(jlstC); jPanel4.add(jScrollPane3); jLabel17.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel17.setText("Motor D: "); jPanel4.add(jLabel17); jlstD.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstD.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jlstAValueChanged(evt); } }); jlstD.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane4.setViewportView(jlstD); jPanel4.add(jScrollPane4); jLabel18.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel18.setText("Motor E: "); jPanel4.add(jLabel18); jlstE.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstE.addListSelectionListener(new javax.swing.event.ListSelectionListener() { 597 public void valueChanged(javax.swing.event.ListSelectionEvent evt) { 598 jlstAValueChanged(evt); 69 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 } }); jlstE.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane5.setViewportView(jlstE); jPanel4.add(jScrollPane5); jLabel19.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel19.setText("Motor F: "); jPanel4.add(jLabel19); jlstF.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstF.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jlstAValueChanged(evt); } }); jlstF.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane6.setViewportView(jlstF); jPanel4.add(jScrollPane6); jLabel20.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel20.setText("Motor G: "); jPanel4.add(jLabel20); jlstG.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstG.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jlstAValueChanged(evt); } }); jlstG.addMouseListener(new java.awt.event.MouseAdapter() { 70 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 }); public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } jScrollPane7.setViewportView(jlstG); jPanel4.add(jScrollPane7); jLabel21.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel21.setText("Motor H: "); jPanel4.add(jLabel21); jlstH.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { jlstAKeyTyped(evt); } }); jlstH.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jlstAValueChanged(evt); } }); jlstH.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jlstAMouseClicked(evt); } }); jScrollPane8.setViewportView(jlstH); jPanel4.add(jScrollPane8); jPanel2.add(jPanel4); jPanel4.setBounds(260, 10, 270, 300); jPanel5.setLayout(null); jPanel5.setBorder(new javax.swing.border.EtchedBorder()); jLabel1.setText("Nome do NSA:"); jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); jPanel5.add(jLabel1); jLabel1.setBounds(10, 10, 90, 15); jPanel5.add(tfNome); tfNome.setBounds(100, 10, 180, 19); btSalvar.setText("Salvar"); btSalvar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btSalvarActionPerformed(evt); } }); 71 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 jPanel5.add(btSalvar); btSalvar.setBounds(300, 10, 95, 23); btCancelar.setText("Cancelar"); btCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btCancelarActionPerformed(evt); } }); jPanel5.add(btCancelar); btCancelar.setBounds(410, 10, 100, 23); jPanel2.add(jPanel5); jPanel5.setBounds(10, 350, 520, 40); jPanel6.setLayout(new java.awt.GridLayout(1, 4)); 18)); jPanel6.setBorder(new javax.swing.border.EtchedBorder()); jLabel2.setFont(new java.awt.Font("Microsoft Sans Serif", 1, jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText("N"); jPanel6.add(jLabel2); 18)); jLabel3.setFont(new java.awt.Font("Microsoft Sans Serif", 1, jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel3.setText("S"); jPanel6.add(jLabel3); 18)); jLabel4.setFont(new java.awt.Font("Microsoft Sans Serif", 1, jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel4.setText("L"); jPanel6.add(jLabel4); 18)); jLabel5.setFont(new java.awt.Font("Microsoft Sans Serif", 1, jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel5.setText("O"); jPanel6.add(jLabel5); jPanel2.add(jPanel6); jPanel6.setBounds(10, 10, 250, 30); getContentPane().add(jPanel2); pack(); } // </editor-fold> { private void jlstAValueChanged(javax.swing.event.ListSelectionEvent evt) } selecionar((javax.swing.JList) evt.getSource()); 72 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 private void btRemoverActionPerformed(java.awt.event.ActionEvent evt) { //remove itens selecionados if(jlstA.getSelectedValue() != null){ int valor, i; i = jlstA.getSelectedIndex(); a.remove(i); b.remove(i); c.remove(i); d.remove(i); e.remove(i); f.remove(i); g.remove(i); h.remove(i); carregarListas(); } } private void btEditarActionPerformed(java.awt.event.ActionEvent evt) { //salva a sequencia exibida if(jlstA.getSelectedValue() != null){ Motor motor; int valor, i; i = jlstA.getSelectedIndex(); jlstA.setSelectedIndex(i); jlstB.setSelectedIndex(i); jlstC.setSelectedIndex(i); jlstD.setSelectedIndex(i); jlstE.setSelectedIndex(i); jlstF.setSelectedIndex(i); jlstG.setSelectedIndex(i); jlstH.setSelectedIndex(i); //Motores nas listas valor = sldNA.getValue(); motor = new Motor("A", valor, 0); a.set(i, motor); valor = sldNB.getValue(); motor = new Motor("B", valor, 0); b.set(i, motor); //motores da fila S - C e D valor = sldSA.getValue(); motor = new Motor("C", valor, 0); c.set(i, motor); valor = sldSB.getValue(); motor = new Motor("D", valor, 0); d.set(i, motor); //motores da fila L - E e F valor = sldLA.getValue(); motor = new Motor("E", valor, 0); 73 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 e.set(i, motor); valor = sldLB.getValue(); motor = new Motor("F", valor, 0); f.set(i, motor); //motores da fila O - G e H valor = sldOA.getValue(); motor = new Motor("G", valor, 0); g.set(i, motor); valor = sldOB.getValue(); motor = new Motor("H", valor, 0); h.set(i, motor); //carregar vectors nas listas carregarListas(); } } public void limpar(){ btLimparActionPerformed(null); btResetarActionPerformed(null); } private void btCancelarActionPerformed(java.awt.event.ActionEvent evt) { //limpar e ocultar btLimparActionPerformed(evt); btResetarActionPerformed(evt); this.setVisible(false); nucleo.atualizarNSA(); } private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) { //criar NPA e enviar para o nucleo boolean confirmacao = true; if((a.size()) != 0 && !(tfNome.getText().equals(""))){ Comando cmd = gerarComando(); NPA npa = new NPA(tfNome.getText(), cmd); //verificar a existência do NPA no bd NPA tmp = nucleo.getControleBD().consultaNPA(tfNome.getText()); if(tmp == null){ //não existe confirmacao = true; }else{//existe, solicitar confirmação } if(confirmacao == true){ //solicitar alteração/cadastro do NSA no BD nucleo.getControleBD().updateNPA(npa); } //zerar e ocultar btCancelarActionPerformed(evt); } 74 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 } private Comando gerarComando(){ Comando cmd = new Comando(); //motores das jlist para o comando Motor m; int cont = a.size(); for(int i=0; i<cont;i++){ jlstA.setSelectedIndex(i); m = (Motor) jlstA.getSelectedValue(); cmd.n.adicionar(m); jlstB.setSelectedIndex(i); m = (Motor) jlstB.getSelectedValue(); cmd.n.adicionar(m); jlstC.setSelectedIndex(i); m = (Motor) jlstC.getSelectedValue(); cmd.s.adicionar(m); jlstD.setSelectedIndex(i); m = (Motor) jlstD.getSelectedValue(); cmd.s.adicionar(m); jlstE.setSelectedIndex(i); m = (Motor) jlstE.getSelectedValue(); cmd.l.adicionar(m); jlstF.setSelectedIndex(i); m = (Motor) jlstF.getSelectedValue(); cmd.l.adicionar(m); jlstG.setSelectedIndex(i); m = (Motor) jlstG.getSelectedValue(); cmd.o.adicionar(m); jlstH.setSelectedIndex(i); m = (Motor) jlstH.getSelectedValue(); cmd.o.adicionar(m); } } return cmd; private void jlstAKeyTyped(java.awt.event.KeyEvent evt) { selecionar((javax.swing.JList) evt.getSource()); } private void jlstAMouseClicked(java.awt.event.MouseEvent evt) { selecionar((javax.swing.JList) evt.getSource()); } private void btLimparActionPerformed(java.awt.event.ActionEvent evt) { //LIMPAR a.clear(); b.clear(); c.clear(); d.clear(); 75 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 e.clear(); f.clear(); g.clear(); h.clear(); carregarListas(); } tfNome.setText(""); public void visualizar(){ btVisualizarActionPerformed(null); } private void btVisualizarActionPerformed(java.awt.event.ActionEvent evt) { //solicita ao nucleo que envie as posições atuais dos motores ao robo 953 //as posições indicadas pelos Slides Control 954 955 nucleo.msg("Visualizar posição:"); 956 957 //gerar comando 958 Comando cmd = new Comando(); 959 Motor motor; 960 int valor; 961 962 //Motores nas listas 963 valor = sldNA.getValue(); 964 motor = new Motor("A", valor, 0); 965 cmd.n.adicionar(motor); 966 967 valor = sldNB.getValue(); 968 motor = new Motor("B", valor, 0); 969 cmd.n.adicionar(motor); 970 971 //motores da fila S - C e D 972 valor = sldSA.getValue(); 973 motor = new Motor("C", valor, 0); 974 cmd.s.adicionar(motor); 975 976 valor = sldSB.getValue(); 977 motor = new Motor("D", valor, 0); 978 cmd.s.adicionar(motor); 979 980 //motores da fila L - E e F 981 valor = sldLA.getValue(); 982 motor = new Motor("E", valor, 0); 983 cmd.l.adicionar(motor); 984 985 valor = sldLB.getValue(); 986 motor = new Motor("F", valor, 0); 987 cmd.l.adicionar(motor); 988 989 //motores da fila O - G e H 990 valor = sldOA.getValue(); 991 motor = new Motor("G", valor, 0); 992 cmd.o.adicionar(motor); 993 76 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 valor = sldOB.getValue(); motor = new Motor("H", valor, 0); cmd.o.adicionar(motor); } nucleo.visualizar(cmd); private void btResetarActionPerformed(java.awt.event.ActionEvent evt) { //ajustar controle para a posição inicial carregarMotores(); } private void btAddActionPerformed(java.awt.event.ActionEvent evt) { //criar motores com valores dos slides e adicionar nos Vectors //carregar vectors nas filas Motor motor; int valor; //Motores nas listas valor = sldNA.getValue(); motor = new Motor("A", valor, 0); a.add(motor); valor = sldNB.getValue(); motor = new Motor("B", valor, 0); b.add(motor); //motores da fila S - C e D valor = sldSA.getValue(); motor = new Motor("C", valor, 0); c.add(motor); valor = sldSB.getValue(); motor = new Motor("D", valor, 0); d.add(motor); //motores da fila L - E e F valor = sldLA.getValue(); motor = new Motor("E", valor, 0); e.add(motor); valor = sldLB.getValue(); motor = new Motor("F", valor, 0); f.add(motor); //motores da fila O - G e H valor = sldOA.getValue(); motor = new Motor("G", valor, 0); g.add(motor); valor = sldOB.getValue(); motor = new Motor("H", valor, 0); h.add(motor); //carregar vectors nas listas carregarListas(); 77 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 } private void carregarListas(){ jlstA.setListData(a); jlstB.setListData(b); jlstC.setListData(c); jlstD.setListData(d); jlstE.setListData(e); jlstF.setListData(f); jlstG.setListData(g); jlstH.setListData(h); } private void sldOBStateChanged(javax.swing.event.ChangeEvent evt) { tfOB.setText("" + sldOB.getValue()); } private void sldOAStateChanged(javax.swing.event.ChangeEvent evt) { tfOA.setText("" + sldOA.getValue()); } private void sldLBStateChanged(javax.swing.event.ChangeEvent evt) { tfLB.setText("" + sldLB.getValue()); } private void sldLAStateChanged(javax.swing.event.ChangeEvent evt) { tfLA.setText("" + sldLA.getValue()); } private void sldSBStateChanged(javax.swing.event.ChangeEvent evt) { tfSB.setText("" + sldSB.getValue()); } private void sldSAStateChanged(javax.swing.event.ChangeEvent evt) { tfSA.setText("" + sldSA.getValue()); } private void sldNBStateChanged(javax.swing.event.ChangeEvent evt) { tfNB.setText("" + sldNB.getValue()); } private void sldNAStateChanged(javax.swing.event.ChangeEvent evt) { tfNA.setText("" + sldNA.getValue()); } // Variables declaration - do not modify private javax.swing.JButton btAdd; private javax.swing.JButton btCancelar; private javax.swing.JButton btEditar; private javax.swing.JButton btLimpar; private javax.swing.JButton btRemover; private javax.swing.JButton btResetar; private javax.swing.JButton btSalvar; private javax.swing.JButton btVisualizar; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12; 78 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private private javax.swing.JLabel jLabel13; javax.swing.JLabel jLabel14; javax.swing.JLabel jLabel15; javax.swing.JLabel jLabel16; javax.swing.JLabel jLabel17; javax.swing.JLabel jLabel18; javax.swing.JLabel jLabel19; javax.swing.JLabel jLabel2; javax.swing.JLabel jLabel20; javax.swing.JLabel jLabel21; javax.swing.JLabel jLabel3; javax.swing.JLabel jLabel4; javax.swing.JLabel jLabel5; javax.swing.JLabel jLabel6; javax.swing.JLabel jLabel7; javax.swing.JLabel jLabel8; javax.swing.JLabel jLabel9; javax.swing.JPanel jPanel1; javax.swing.JPanel jPanel10; javax.swing.JPanel jPanel11; javax.swing.JPanel jPanel12; javax.swing.JPanel jPanel13; javax.swing.JPanel jPanel14; javax.swing.JPanel jPanel2; javax.swing.JPanel jPanel3; javax.swing.JPanel jPanel4; javax.swing.JPanel jPanel5; javax.swing.JPanel jPanel6; javax.swing.JPanel jPanel7; javax.swing.JPanel jPanel8; javax.swing.JPanel jPanel9; javax.swing.JScrollPane jScrollPane1; javax.swing.JScrollPane jScrollPane2; javax.swing.JScrollPane jScrollPane3; javax.swing.JScrollPane jScrollPane4; javax.swing.JScrollPane jScrollPane5; javax.swing.JScrollPane jScrollPane6; javax.swing.JScrollPane jScrollPane7; javax.swing.JScrollPane jScrollPane8; javax.swing.JList jlstA; javax.swing.JList jlstB; javax.swing.JList jlstC; javax.swing.JList jlstD; javax.swing.JList jlstE; javax.swing.JList jlstF; javax.swing.JList jlstG; javax.swing.JList jlstH; javax.swing.JSlider sldLA; javax.swing.JSlider sldLB; javax.swing.JSlider sldNA; javax.swing.JSlider sldNB; javax.swing.JSlider sldOA; javax.swing.JSlider sldOB; javax.swing.JSlider sldSA; javax.swing.JSlider sldSB; javax.swing.JTextField tfLA; 79 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 private javax.swing.JTextField tfLB; private javax.swing.JTextField tfNA; private javax.swing.JTextField tfNB; private javax.swing.JTextField tfNome; private javax.swing.JTextField tfOA; private javax.swing.JTextField tfOB; private javax.swing.JTextField tfSA; private javax.swing.JTextField tfSB; // End of variables declaration private void selecionar(javax.swing.JList lista){ if(lista.getSelectedValue() != null){ int i = lista.getSelectedIndex(); //aplicar as lista o index jlstA.setSelectedIndex(i); jlstB.setSelectedIndex(i); jlstC.setSelectedIndex(i); jlstD.setSelectedIndex(i); jlstE.setSelectedIndex(i); jlstF.setSelectedIndex(i); jlstG.setSelectedIndex(i); jlstH.setSelectedIndex(i); Motor m; m = (Motor) jlstA.getSelectedValue(); sldNA.setValue(m.getValor()); m = (Motor) jlstB.getSelectedValue(); sldNB.setValue(m.getValor()); m = (Motor) jlstC.getSelectedValue(); sldSA.setValue(m.getValor()); m = (Motor) jlstD.getSelectedValue(); sldSB.setValue(m.getValor()); m = (Motor) jlstE.getSelectedValue(); sldLA.setValue(m.getValor()); m = (Motor) jlstF.getSelectedValue(); sldLB.setValue(m.getValor()); m = (Motor) jlstG.getSelectedValue(); sldOA.setValue(m.getValor()); } } m = (Motor) jlstH.getSelectedValue(); sldOB.setValue(m.getValor()); public void desmontarComando(Comando cmd){ int cont = cmd.n.getElementos(); //limpar vectors a.clear(); b.clear(); c.clear(); 80 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 } d.clear(); e.clear(); f.clear(); g.clear(); h.clear(); //carregar motores Motor m; for(int i=0;i<cont;i++){ //motor A m = cmd.n.remover(); a.add(m); //motor B m = cmd.n.remover(); b.add(m); //motor C m = cmd.s.remover(); c.add(m); //motor D m = cmd.s.remover(); d.add(m); //motor E m = cmd.l.remover(); e.add(m); //motor F m = cmd.l.remover(); f.add(m); //motor G m = cmd.o.remover(); g.add(m); } } //motor H m = cmd.o.remover(); h.add(m); public void editar(NPA item){ limpar(); tfNome.setText(item.getId()); desmontarComando(item.getCmd()); carregarListas(); setVisible(true); } public void novo(){ limpar(); setVisible(true); } 81 TelaNSA.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 /* * TelaNSA.java */ package ar.interacao; import import import import import import ar.controle.bd.ValidadorNSA; ar.informacao.*; ar.informacao.NPA; ar.informacao.NSA; java.util.Vector; ar.nucleo.*; /** * * @author Leonardo Torati */ public class TelaNSA extends javax.swing.JFrame { private Nucleo nucleo; private Vector<BDListaElemento> novoNsa; /** * */ public TelaNSA(Nucleo n) { nucleo = n; initComponents(); novoNsa = new Vector<BDListaElemento>(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lstNPA = new javax.swing.JList(); jPanel3 = new javax.swing.JPanel(); btAddNPA = new javax.swing.JButton(); btEditarNPA = new javax.swing.JButton(); btNovoNPA = new javax.swing.JButton(); btExcluirNPA = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); lstNovoNSA = new javax.swing.JList(); jPanel5 = new javax.swing.JPanel(); btExcluirItem = new javax.swing.JButton(); tfNomeNovoNSA = new javax.swing.JTextField(); btSalvarNovoNSA = new javax.swing.JButton(); btCancelarNovoNSA = new javax.swing.JButton(); jPanel6 = new javax.swing.JPanel(); btAddNSA = new javax.swing.JScrollPane(); lstNSA = new javax.swing.JList(); 82 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 jPanel7 = new javax.swing.JPanel(); jButton8 = new javax.swing.JButton(); btEditarNSA = new javax.swing.JButton(); btNovoNSA = new javax.swing.JButton(); btExcluirNSA = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); setTitle("Edi\u00e7\u00e3o de NSA"); setName("NSA"); setResizable(false); jPanel1.setLayout(null); jPanel1.setPreferredSize(new java.awt.Dimension(440, 280)); jPanel2.setLayout(new java.awt.GridLayout(2, 1)); jPanel2.setBorder(new javax.swing.border.TitledBorder("NPAs")); jScrollPane1.setViewportView(lstNPA); jPanel2.add(jScrollPane1); jPanel3.setLayout(new java.awt.GridLayout(4, 1)); btAddNPA.setText("ADD >"); btAddNPA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btAddNPAActionPerformed(evt); } }); jPanel3.add(btAddNPA); btEditarNPA.setText("Editar"); btEditarNPA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btEditarNPAActionPerformed(evt); } }); jPanel3.add(btEditarNPA); btNovoNPA.setText("Novo"); btNovoNPA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btNovoNPAActionPerformed(evt); } }); jPanel3.add(btNovoNPA); btExcluirNPA.setText("Excluir"); btExcluirNPA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btExcluirNPAActionPerformed(evt); } }); jPanel3.add(btExcluirNPA); 83 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 jPanel2.add(jPanel3); jPanel1.add(jPanel2); jPanel2.setBounds(10, 10, 140, 260); jPanel4.setLayout(new java.awt.GridLayout(2, 1)); jPanel4.setBorder(new javax.swing.border.TitledBorder(null, "Novo NSA", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Microsoft Sans Serif", 0, 11), java.awt.Color.red)); jScrollPane2.setViewportView(lstNovoNSA); jPanel4.add(jScrollPane2); jPanel5.setLayout(new java.awt.GridLayout(4, 1)); btExcluirItem.setText("Excluir"); btExcluirItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btExcluirItemActionPerformed(evt); } }); jPanel5.add(btExcluirItem); jPanel5.add(tfNomeNovoNSA); { btSalvarNovoNSA.setText("Salvar"); btSalvarNovoNSA.addActionListener(new java.awt.event.ActionListener() }); public void actionPerformed(java.awt.event.ActionEvent evt) { btSalvarNovoNSAActionPerformed(evt); } jPanel5.add(btSalvarNovoNSA); btCancelarNovoNSA.setText("Cancelar"); btCancelarNovoNSA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btCancelarNovoNSAActionPerformed(evt); } }); jPanel5.add(btCancelarNovoNSA); jPanel4.add(jPanel5); jPanel1.add(jPanel4); jPanel4.setBounds(150, 10, 140, 260); jPanel6.setLayout(new java.awt.GridLayout(2, 1)); jPanel6.setBorder(new javax.swing.border.TitledBorder("NSAs")); btAddNSA.setViewportView(lstNSA); 84 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 jPanel6.add(btAddNSA); jPanel7.setLayout(new java.awt.GridLayout(4, 1)); jButton8.setText("< ADD"); jButton8.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton8ActionPerformed(evt); } }); jPanel7.add(jButton8); btEditarNSA.setText("Editar"); btEditarNSA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btEditarNSAActionPerformed(evt); } }); jPanel7.add(btEditarNSA); btNovoNSA.setText("Novo"); btNovoNSA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btNovoNSAActionPerformed(evt); } }); jPanel7.add(btNovoNSA); btExcluirNSA.setText("Excluir"); btExcluirNSA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btExcluirNSAActionPerformed(evt); } }); jPanel7.add(btExcluirNSA); jPanel6.add(jPanel7); jPanel1.add(jPanel6); jPanel6.setBounds(290, 10, 140, 260); getContentPane().add(jPanel1); pack(); } // </editor-fold> private void btEditarNSAActionPerformed(java.awt.event.ActionEvent evt) { if(lstNSA.getSelectedValue() != null){ String id = (String) lstNSA.getSelectedValue(); NSA tmp = nucleo.getControleBD().consultaNSA(id); if(tmp != null){ //listar 85 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 tfNomeNovoNSA.setText(tmp.getId()); novoNsa = tmp.getLista(); atualizarListas(); } } } private void btExcluirNSAActionPerformed(java.awt.event.ActionEvent evt) { if(lstNSA.getSelectedValue() != null){ //confirmar antes de excluir String id = (String) lstNSA.getSelectedValue(); nucleo.getControleBD().excluirNSA(id); atualizarListas(); nucleo.atualizarNSA(); } } private void btNovoNSAActionPerformed(java.awt.event.ActionEvent evt) { novoNsa.clear(); tfNomeNovoNSA.setText(""); listarNovoNSA(); } private void btCancelarNovoNSAActionPerformed(java.awt.event.ActionEvent evt) { novoNsa.clear(); tfNomeNovoNSA.setText(""); listarNovoNSA(); setVisible(false); } private void btSalvarNovoNSAActionPerformed(java.awt.event.ActionEvent evt) { boolean confirmacao = true; if(novoNsa.size() > 0 && !tfNomeNovoNSA.getText().equals("")){ String nomeNovoNsa = tfNomeNovoNSA.getText(); Vector<String> vtmp = new Vector<String>(); vtmp.add(nomeNovoNsa); vtmp); ValidadorNSA vNsa = new ValidadorNSA(nucleo, nomeNovoNsa, if(vNsa.validar() == true){ //NSA é válido NSA novo = new NSA(nomeNovoNsa, novoNsa); //verificar se existe NSA com mesmo nome NSA tmp = nucleo.getControleBD().consultaNSA(nomeNovoNsa); if(tmp != null){ //NSA existe, solicitar confirmação confirmacao = true; } if(confirmacao == true){ nucleo.getControleBD().updateNSA(novo); } novoNsa.clear(); tfNomeNovoNSA.setText(""); listarNovoNSA(); atualizarListas(); 86 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 nucleo.atualizarNSA(); } } }else{ nucleo.msg("O NSA criado não é válido!"); } private void btExcluirNPAActionPerformed(java.awt.event.ActionEvent evt) { String nome = (String) lstNPA.getSelectedValue(); if(nome != null){ //confirmação de exclusão nucleo.getControleBD().excluirNPA(nome); Vector<String> v = nucleo.getControleBD().listaNPA(); listarNPA(v); } } private void btNovoNPAActionPerformed(java.awt.event.ActionEvent evt) { nucleo.getTelaNPA().novo(); } private void btExcluirItemActionPerformed(java.awt.event.ActionEvent evt) { BDListaElemento bde = (BDListaElemento) lstNovoNSA.getSelectedValue(); if(bde != null){ novoNsa.remove(bde); listarNovoNSA(); } } private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) { String nome = (String) lstNSA.getSelectedValue(); if(nome != null) addNovo(nome, "NSA"); } private void btAddNPAActionPerformed(java.awt.event.ActionEvent evt) { String nome = (String) lstNPA.getSelectedValue(); if(nome != null) addNovo(nome, "NPA"); } private void btEditarNPAActionPerformed(java.awt.event.ActionEvent evt) { if(lstNPA.getSelectedValue() == null){ //novo NPA nucleo.getTelaNPA().novo(); }else{ //editar NPA String nome = (String) lstNPA.getSelectedValue(); if(nome != null){ NPA tmp = nucleo.getControleBD().consultaNPA(nome); if(tmp != null){ nucleo.getTelaNPA().editar(tmp); } } } } // Variables declaration - do not modify 87 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 } private javax.swing.JButton btAddNPA; private javax.swing.JScrollPane btAddNSA; private javax.swing.JButton btCancelarNovoNSA; private javax.swing.JButton btEditarNPA; private javax.swing.JButton btEditarNSA; private javax.swing.JButton btExcluirItem; private javax.swing.JButton btExcluirNPA; private javax.swing.JButton btExcluirNSA; private javax.swing.JButton btNovoNPA; private javax.swing.JButton btNovoNSA; private javax.swing.JButton btSalvarNovoNSA; private javax.swing.JButton jButton8; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel7; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JList lstNPA; private javax.swing.JList lstNSA; private javax.swing.JList lstNovoNSA; private javax.swing.JTextField tfNomeNovoNSA; // End of variables declaration public void atualizarListas(){ listarNPA(nucleo.getControleBD().listaNPA()); listarNSA(nucleo.getControleBD().listaNSA()); listarNovoNSA(); } public void listarNPA(Vector<String> v){ lstNPA.setListData(v); } public void listarNSA(Vector<String> v){ lstNSA.setListData(v); } private void listarNovoNSA(){ lstNovoNSA.setListData(novoNsa); } private void addNovo(String id, String tipo){ BDListaElemento bde = new BDListaElemento(id, tipo); novoNsa.add(bde); listarNovoNSA(); } 88 PACOTE: ae.nucleo Nucleo.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 /* * Nucleo.java */ package ar.nucleo; import import import import import import import import import import import import import ar.informacao.*; ar.informacao.NPA; ar.informacao.NSA; ar.interacao.*; ar.nucleo.*; java.io.*; javax.swing.JList; javax.swing.JTextArea; java.util.Vector; java.sql.*; //ResultSet java.util.Properties; ar.controle.*; ar.controle.bd.*; /** * * @author Leonardo Torati */ public class Nucleo { private Transm transm; private Escalonador esc; private private private private ControleDelay cdelay; //= new ControleDelay(this); Conexao conexao; ControleBD cbd; TelaAguarde telaA; private TelaNPA npa; private TelaNSA nsa; private String nsaExecucao; //==== COMANDOS ============================================================ /** * */ public void visualizar(Comando cmd){ if(cmd != null){ limparLog(); String tmp = "Vis:" + cmd.getElementos(); FilaComando fcmd = new FilaComando(); FilaComandoEscalonado fcmde = new FilaComandoEscalonado(); 89 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 fcmd.adicionar(cmd); //adiciona cmd a uma fila escalonada msg("Controle de Delay..."); cdelay.setEntrada(fcmd); cdelay.ajustarDelay(); msg("Escalonador..."); esc.setEntrada(cdelay.getSaida()); //prepara fila para ser esc.escalonar("VIS", false); //escalona fila fcmde.adicionar(esc.getSaida()); transm.setEntrada(fcmde); //prepara fila escalonada para ser transmitida msg("Transmissor:"); transm.transmitir(); //transmite fila } } public void executarNPA(NPA item){ FilaComando fc = new FilaComando(); msg("Executando NPA: " + item.getId()); Comando cmd = item.getCmd(); if(cmd.getElementos() == 0){ msg("Não há elementos no NPA para executar."); }else{ fc.adicionar(cmd); preparar(fc); } } public void executarNSA(String id){ //obter nsa NSA item = cbd.consultaNSA(id); if(item != null){ //desmontar NSA FilaComando fila = new FilaComando(); Vector<String> lista = new Vector<String>(); lista.add(id); DesmontadorNSA dnsa = new DesmontadorNSA(this, id, lista, fila); if(dnsa.desmontar() == false){ msg("Desmontando NSA.", "Falha ao desmontar."); } } } nsaExecucao = id; preparar(fila); lstProcessados.setListData(cbd.listaNSAProcessado()); /** * */ public void preparar(FilaComando fila){ telaA.setVisible(true); if(fila != null){ limparLog(); 90 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 cdelay.setEntrada(fila); cdelay.ajustarDelay(); //calcular delay necessario esc.setEntrada(cdelay.getSaida()); esc.escalonar(nsaExecucao, true); } } telaA.setVisible(false); public void transmitir(FilaComandoEscalonado f){ transm.setEntrada(f); transm.transmitir(); } //====ARQUIVO DE PARÂMETROS================================================= private Parametros parametros; public Parametros getParametros(){ return parametros; } public void setParametros(Parametros p){ parametros = p; } private String arquivo = "parametros.properties"; public void carregarParametros(){ parametros = new Parametros(this); java.io.FileInputStream entrada = null; Properties prop = new Properties(); java.io.File file = new java.io.File(arquivo); try{ entrada = new java.io.FileInputStream(file); try{ prop.load(entrada); parametros.setProperties(prop); }catch(java.io.IOException e){ msg("Lendo arquivo de parâmetros.", e.toString()); } }catch(java.io.FileNotFoundException e){ msg("Abrindo arquivo de parâmetros.", e.toString()); } } public void salvarParametros(){ Properties prop = parametros.getProperties(); if(prop != null){ java.io.FileOutputStream saida = null; 91 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 java.io.File file = new java.io.File(arquivo); try{ saida = new java.io.FileOutputStream(file); try{ prop.store(saida, "parametros"); msg("Parâmetros salvos."); }catch(java.io.IOException e){ msg("Gravando arquivo de parâmetros.", e.toString()); } }catch(FileNotFoundException e){ msg("Salvando arquivo de parâmetros.", e.toString()); } } } //====LOG============================================================= ====== //mensagem de saida para a tela principal private JTextArea jtxt; public void msg(String m){ if(jtxt != null){ jtxt.append("\n" + m); logVerFim(); } } public void msg(String m, String erro){ if(jtxt != null){ jtxt.append("\n\n ### ERRO: ###\n" + m + "\n >" + erro +"\n#############"); logVerFim(); } } public void msg(String m, boolean noLinha){ if(jtxt != null){ jtxt.append(m); logVerFim(); } } public JTextArea getJtxt(){ return jtxt; } public void setJtxt(JTextArea jt){ jtxt = jt; jtxt.setText("LOG."); } private void logVerFim(){ if(jtxt != null){ jtxt.select(jtxt.getText().length(), jtxt.getText().length()); } } public void limparLog(){ jtxt.setText(""); 92 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 } //====BANCO DE DADOS======================================================== public Conexao getConexao(){ return conexao; } public ControleBD getControleBD(){ return cbd; } //====ACESSO AS TELAS======================================================= private JList lstPrincipal, lstProcessados; private Vector<String> vPrincipal, vProcessados; public TelaNPA getTelaNPA(){ return npa; } public TelaNSA getTelaNSA(){ return nsa; } public void atualizarNSA(){ nsa.atualizarListas(); vPrincipal = cbd.listaNSA(); vProcessados = cbd.listaNSAProcessado(); lstPrincipal.setListData(vPrincipal); lstProcessados.setListData(vProcessados); } //====CONSTRUTOR====================================================== ====== /** * */ public Nucleo(JTextArea jta, JList lst, JList lst2) { vPrincipal = new Vector<String>(); lstPrincipal = lst; lstProcessados = lst2; 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 } setJtxt(jta); //abrir e carregar parametros msg("Carregando parâmetros..."); carregarParametros(); esc = new Escalonador(this); cdelay = new ControleDelay(this); transm = new Transm(this); conexao = new Conexao(this); conexao.conectar(); cbd = new ControleBD(this, conexao); npa = new TelaNPA(this); nsa = new TelaNSA(this); } telaA = new TelaAguarde(); 93 Parâmetros.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /* * Parametros.java */ package ar.nucleo; import ar.informacao.ValorMotores; /** * * @author Leonardo Torati */ public class Parametros { Nucleo nucleo; //====INICIALIZAÇÃO DOS MOTORES============================================= private ValorMotores valorMotores; public void setIni(ValorMotores vm){ valorMotores = vm; } public ValorMotores getIni(){ return valorMotores; } //====AJUSTES========================================================= ====== private int delayMax, tempoDelay; private String portaSerial; public void setDelayMax(int dm){ delayMax = dm; } public int getDelayMax(){ return delayMax; } public void setTempoDelay(int td){ tempoDelay = td; } public int getTempoDelay(){ return tempoDelay; } public String getPortaSerial(){ return portaSerial; } public void setPortaSerial(String ps){ portaSerial = ps; } 94 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 //====BANCO DE DADOS======================================================== private String login, senha, arquivo; public void setLogin(String l){ login = l; } public String getLogin(){ return login; } public void setSenha(String s){ senha = s; } public String getSenha(){ return senha; } public void setArquivo(String arq){ arquivo = arq; } public String getArquivo(){ return arquivo; } //====VALORES PADRÃO======================================================== private void valorPadrao(){ int valPadrao = 64; valorMotores = new ValorMotores(valPadrao); tempoDelay = 500; delayMax = 750; login = "sysdba"; senha = "masterkey"; } portaSerial = "COM1"; //====PROPERTIES====================================================== ====== private java.util.Properties prop; public java.util.Properties getProperties(){ prop = new java.util.Properties(); prop.setProperty("motorA", prop.setProperty("motorB", prop.setProperty("motorC", prop.setProperty("motorD", prop.setProperty("motorE", prop.setProperty("motorF", "" "" "" "" "" "" + + + + + + valorMotores.a); valorMotores.b); valorMotores.c); valorMotores.d); valorMotores.e); valorMotores.f); 95 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 prop.setProperty("motorG", "" + valorMotores.g); prop.setProperty("motorH", "" + valorMotores.h); prop.setProperty("delayMax", "" + delayMax); prop.setProperty("tempoDelay", "" + tempoDelay); prop.setProperty("login", login); prop.setProperty("senha", senha); prop.setProperty("arquivo", arquivo); prop.setProperty("portaSerial", portaSerial); } return prop; public void setProperties(java.util.Properties p){ boolean flag = true; String v; if(p != null){ v = p.getProperty("motorA"); if(v != null){ valorMotores.a = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorB"); if(v != null){ valorMotores.b = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorC"); if(v != null){ valorMotores.c = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorD"); if(v != null){ valorMotores.d = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorE"); if(v != null){ valorMotores.e = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorF"); if(v != null){ valorMotores.f = Integer.parseInt(v); 96 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 }else{ flag = false; } v = p.getProperty("motorG"); if(v != null){ valorMotores.g = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("motorH"); if(v != null){ valorMotores.h = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("delayMax"); if(v != null){ delayMax = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("tempoDelay"); if(v != null){ tempoDelay = Integer.parseInt(v); }else{ flag = false; } v = p.getProperty("login"); if(v != null){ login = v; }else{ flag = false; } v = p.getProperty("senha"); if(v != null){ senha = v; }else{ flag = false; } v = p.getProperty("arquivo"); if(v != null){ arquivo = v; }else{ flag = false; } v = p.getProperty("portaSerial"); if(v != null){ portaSerial = v; }else{ flag = false; 97 226 227 228 229 230 231 232 233 } }else{ flag = false; } if(flag == false){//falha no carregamento dos parametros nucleo.msg("Inicializar parâmetros.", "Valor padrão atribuído."); valorPadrao(); //assume padrao } } 234 235 236 237 238 239 240 241 242 243 244 245 } /** * */ public Parametros(Nucleo n) { nucleo = n; valorPadrao(); } 98 PACOTE: ar Main.java 1 /* 2 * Main.java 3 */ 4 5 package ar; 6 7 import ar.interacao.*; 8 /** 9 * 10 * @author Leonardo Torati 11 */ 12 public class Main { 13 14 /** 15 * 16 */ 17 public static void main(String[] args) { 18 System.out.println("ARc - Sistema de Controle do AR+"); 19 20 Splash splash; 21 splash = new Splash(); 22 splash.setVisible(true); 23 24 //form principal 25 Principal p = new Principal(); 26 p.setVisible(true); 27 28 splash.setVisible(false); 29 splash = null; 30 } 31 }
Documentos relacionados
Vídeo captura utilizando Java e DirectX Introdução
Este documento demonstra como realizar vídeo captura de uma webCam utilizando DirectX e Java. Tecnologias utilizadas:
Leia mais