помилка у контрольній сумі (виникла помилка при передачі).
Якщо все гаразд – (не виникло жодної помилки) – отримуємо на екрані результат опитування модуля).
Також можна опитати усі активні модулі натиснувши на кнопку “Опитати всі модулі”, при цьому отримаємо інформаціюпо всіх модулях, зазначених у списку, якщо результати опитування певного модуля не присутні на інформаційній панелі – треба дивитися список помилок.
2.3 Робота з програмою у тестовому режимі
Для роботи програми у тестовому режимі необхіден файл TestValues.properties, що входить до складу програмного виробу.
Для запуску програми у тестовому режим інеобхідно виконати наступні дії:
запустити програму (див. пункт 2.1);
обрами меню «Настройки», встановити галочку «Робота програми у тестовому режимі» (рис. 1).
Риунок 1. Встановлення тестового режиму роботи програми.
При встановлені тестового режиму програма буде імітувати сигнали-відповіді від конкретних модулів, вказаних у файлі Modules.properties.
Якщо запустити на виконання програму із запропонованим набором даних, загрузити набір модулей, з якими вестиметься робота, попередньо встановивши тестовий режим роботи програми, тоді у режимі опиту всіх модулей програма має надати наступну інформацію (рис.2)
Також можливий й опит окремих модулів із отриманням у якості інфорамції-відповіді тестову послідовність з файлу.
Рисунок 2. Опит всіх модулей із запропонованим набором даних у тестовому режимі.
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
Кафедра “обчислювальна техніка та програмування”
Затверджую :
Завідуючий кафедрою “ОТП”
______________ Xxxxxxxx.
“___”________________ 2005р
Прилад прийому та обробки метеорологічних даних
Текст програми
Лист затвердження
xxxxxxxx 99092-00-12 ЛЗ
Розробники:
Керівник проекту:
проф. xxxxxx.
“___”_________2005р
Виконавець:
Студент групи xxxxxx
xxxxxxxx.
“___”_________2005р
Харків 2005
ЗАТВЕРДЖЕНО
КІТ19Б 99092-00-12 ЛЗ
Прилад прийому та обробки метеорологічних даних
Текст програми
КІТ19Б 99092-00-12
Листів 17
Харків 2005
Клас ui.MainFrame
package dip.ui;
//Підключення необхідних класів та пакетів
import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import javax.comm.CommDriver;
import javax.comm.CommPortIdentifier;
import java.util.Enumeration;
import javax.comm.ParallelPort;
import java.io.OutputStream;
import java.io.*;
import javax.comm.*;
import dip.util.*;
import java.awt.event.ActionEvent;
import dip.obj.Module;
import dip.obj.WeatherData;
import javax.swing.table.DefaultTableModel;
import java.util.ResourceBundle;
import java.util.ArrayList;
import java.util.Locale;
import java.util.PropertyResourceBundle;
public class MainFrame extends JFrame implements ParallelPortEventListener, CommPortOwnershipListener{
//ініціалізація полей класу
private JMenuBar mainMenu = new JMenuBar();
private JSplitPane split = new JSplitPane();
private JPanel leftPanel = new JPanel();
private JPanel rightPanel = new JPanel();
private UserSettingsDialog settingsDialog = new UserSettingsDialog(this);
private JTable table = new JTable();
private Object [] tableColumnNames = new Object[]{"№ мод", "Т-ра (\u25E6C)", "Тиск(мм.рт.ст.)", "Напр. вітру", "Сила вітру(м/с)"};
private DefaultTableModel tableModel = new DefaultTableModel(null,tableColumnNames);
private JList list = new JList();
private DefaultListModel listModel = new DefaultListModel();
private JScrollPane scrollTable = new JScrollPane();
private JScrollPane scrollList = new JScrollPane();
private static JFrame mainFrame = null;
private JButton activeModulesListButton = new JButton("Список активних модулів");
private JButton askAllModulesButton = new JButton("Опитати всі");
private JButton askModuleButton = new JButton("Опитати модуль");
private JButton settingsButton = new JButton("Настройки");
private JSpinner moduleNumberSpinner = new JSpinner();
private ParallelPort ourParallelPort = null;
private Transmitter transmitter = null;
private Receiver receiver = null;
private ArrayList activeModules = new ArrayList();//список активних модулів
private MainFrame() {
initData();
try {
jbInit();
this.setSize(600, 400);
this.setTitle("Прийом та обробка метеорологічних даних");
// this.pack();}
catch(Exception ex)
{JOptionPane.showMessageDialog(this, "Ошибка инициализации данных");
ex.printStackTrace();}}
public static JFrame getMainFrame()
{if (mainFrame != null) return mainFrame;
mainFrame = new MainFrame();
return mainFrame;}
void jbInit() throws Exception
{//ініціалізація графічного інтерфейсу
this.setJMenuBar(mainMenu);
mainMenu.add(new JMenu("Файл"));
JMenu settingsMenu = new JMenu("Настройки");
mainMenu.add(settingsMenu);
JMenuItem settingsItem = new JMenuItem("Настройки");
settingsMenu.add(settingsItem);
settingsItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
settingsDialog.show();}});
leftPanel.setLayout(new BorderLayout());
rightPanel.setLayout(new GridBagLayout());
this.getContentPane().add(split);
split.add(leftPanel, JSplitPane.LEFT);
leftPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(Color.green,Color.blue),"Інформаційна панель"));
split.add(rightPanel, JSplitPane.RIGHT);
split.setDividerLocation(200);
leftPanel.add(scrollTable);
scrollTable.getViewport().add(table);
rightPanel.add(scrollList, new GridBagConstraints(0, 0, 2, 1, 1.0, 1.0
, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0));
scrollList.getViewport().add(list);
scrollList.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(Color.green,Color.blue),"Список модулів"));
rightPanel.add(activeModulesListButton, new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0
, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 0, 0));
rightPanel.add(askAllModulesButton, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0
, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 0, 0));
rightPanel.add(askModuleButton, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(3, 2, 3, 2), 0, 0));
rightPanel.add(moduleNumberSpinner, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
,GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(3, 0, 3, 0), 0, 5));
moduleNumberSpinner.setModel(new SpinnerNumberModel(0,0,255,1));
table.setModel(tableModel);}
void initData()
{try
{//ініціалізація драйверу для роботи з портом
String drivername = "com.sun.comm.Win32Driver";
Class.forName(drivername);
CommDriver driver = (CommDriver) Class.forName(drivername).newInstance();
driver.initialize();}
catch (Exception ee) {
ee.printStackTrace();}
CommPortIdentifier portIdentifier;
Enumeration portList = CommPortIdentifier.getPortIdentifiers();//отримання спису портів вводу/виводу
while (portList.hasMoreElements()) {
portIdentifier = (CommPortIdentifier) portList.nextElement();
if (portIdentifier.getPortType() == CommPortIdentifier.PORT_PARALLEL) {System.out.println("Found Parralel Port :" + portIdentifier.getName());
if (portIdentifier.getName().equals("LPT1")) {//знаходимо потрібний для роботи порт
try
{ourParallelPort = (ParallelPort) portIdentifier.open("APP", 2000);//”відкриваємо порт для подальшої роботи”}
catch (PortInUseException ex)
{ BadEvent.throwCriticalEvent(ex, this, "LPT-порт занят");}
OutputStream out = null;
try
{out = ourParallelPort.getOutputStream();//отримання потоку на запис
ourParallelPort.setOutputBufferSize(Transmitter.PACKAGE_SIZE);}
catch (IOException ex)
{BadEvent.throwCriticalEvent(ex, this, "Ошибка при инициализации LPT-порта для записи данных");
ourParallelPort.close();}
catch (NullPointerException ex)
{System.out.println("ERROR: OutPutStream could not be Created.");
ourParallelPort.close();}
InputStream in = null;
try
{ourParallelPort.setInputBufferSize(Receiver.PACKAGE_SIZE);}
catch (NullPointerException ex)
{System.out.println("ERROR: OutPutStream could not be Created.");
ourParallelPort.close();}
//клас для роботи з портом на запис
transmitter = Transmitter.getInstance();
transmitter.setOut(out);
transmitter.setOwner(this);
transmitter.setParallelPort(ourParallelPort);
//клас для роботи з портом на читання
receiver = Receiver.getInstanse();
receiver.setIn(in);
receiver.setOwner(this);
receiver.setParalellPort(ourParallelPort);
new Thread(receiver).start();
//задаємо прослуховувачі на кнопки
askModuleButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
Integer moduleNumber = (Integer)moduleNumberSpinner.getValue();
boolean show = false;
if (activeModules != null)
{for (int i = 0; i < activeModules.size(); i++) {
Module m = (Module)activeModules.get(i);
if (m.getModuleNumber().intValue() == moduleNumber.intValue())
{show = true; break;}}}
if (show) askModule(moduleNumber); else
{JOptionPane.showMessageDialog(MainFrame.this, "Модуля с таким номером не существует ");}}});
askAllModulesButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
askAllModules();}});
activeModulesListButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
readModulesFromFile();}});}
public void parallelEvent(ParallelPortEvent parallelPortEvent)
{}
public void ownershipChange(int type)
{}
void askModule(Integer moduleNumber)
{Module module = new Module(moduleNumber);
module.sendModuleNumber();
if (Helper.TEST_MODE)//якщо режим тестовий, засилаємо у порт певну послідовність
{byte[] bb = Helper.testStringIntoBytes(moduleNumber.intValue());
Transmitter t = Transmitter.getInstance();
t.writeTestQuerysendBytes(Helper.integerToBytes(bb);}
try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { }
//відправили повідомлення. Тепер чекаємо
byte[] answer = receiver.getBuffer();//отримуємо буфер через певний проміжок часу.
try
{module.createWeatherData(answer);//утворюємо дані пропогоду}
catch (Exception ex)
{JOptionPane.showMessageDialog(this, ex.getMessage());
return;}
WeatherData wethData = module.getWeatherData();
if (wethData.checkSrc() == true)
{drowOneModule(module);//якщо контрольна сума збіглася – рисуємо.}
else
{JOptionPane.showMessageDialog(this, "Ошибка контрольной суммы");}}
private void askAllModules()
{ArrayList modulesToDraw = new ArrayList();
String errStr = "";
if (activeModules == null || activeModules.size() == 0)//якщо список модулів порожній
{JOptionPane.showMessageDialog(this, "Список активных модулей пуст");
return;}
System.err.println("Всего модулей: "+activeModules.size());
for (int i = 0; i < activeModules.size(); i++)//опитуємо всі модулі
{Module currentModule = (Module)activeModules.get(i);//звернення до поточного
currentModule.sendModuleNumber();//запитуємо певний модуль
try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { }
if (Helper.TEST_MODE)//якщо режим тестовий, засилаємо у порт певну послідовність
{byte[] bb = Helper.testStringIntoBytes(moduleNumber.intValue());
Transmitter t = Transmitter.getInstance();
t.writeTestQuery(Helper.integerToBytes(bb);}
if (bb == null)
{errStr += "Модуль № "+currentModule.getModuleNumber()+" не даёт ответ\n";
continue;//якщо помилка – перериваємо обробку модуля}
try { Thread.sleep(Helper.WaitForResponceInMilis); } catch (InterruptedException ex) { }
byte[] answer = receiver.buffer;//отримуємо буфер через певний проміжок часу
try
{currentModule.createWeatherData(answer);}
catch (Exception ex) {
System.err.println("Несовпадение");
errStr += "Модуль № "+currentModule.getModuleNumber()+" Несовпадение номера модуля\n";
continue;}
WeatherData wethData = currentModule.getWeatherData();
if (wethData.checkSrc() == true)
{modulesToDraw.add(currentModule);//додаємо до списку відних модулів}
else
{errStr += "Модуль № "+currentModule.getModuleNumber()+" Ошибка контрольной суммы\n";