Для роботи програми у тестовому режимі необхіден файл 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";
continue;// якщо помилка – перериваємо обробку модуля}}
drowModules(modulesToDraw);
if (errStr.length() > 0) JOptionPane.showMessageDialog(this, errStr);}
private void drowOneModule(Module module)// прорисовка даних про один модуль
{System.err.println(""+module.getWeatherData().getRealTemperature());
System.err.println(""+module.getWeatherData().getRealPresure());
Object[][] objectData = new Object [][]{
{module.getModuleNumber(),
module.getWeatherData().getRealTemperature(),
module.getWeatherData().getRealPresure(),
module.getWeatherData().getRealWindDirection(),
module.getWeatherData().getRealWindPower()}};
tableModel = new DefaultTableModel(objectData, tableColumnNames);
table.setModel(tableModel);}
//рисуємо відразудекілька модулів
private void drowModules(ArrayList modules)
{Object [][] objectData = new Object[modules.size()][5];
for (int i = 0; i < modules.size(); i++)
{Module m = (Module)modules.get(i);
objectData[i][0] = m.getModuleNumber();
objectData[i][1] = m.getWeatherData().getRealTemperature();
objectData[i][2] = m.getWeatherData().getRealPresure();
objectData[i][3] = m.getWeatherData().getRealWindDirection();
objectData[i][4] = m.getWeatherData().getRealWindPower();}
tableModel = new DefaultTableModel(objectData, tableColumnNames);
table.setModel(tableModel);}
//читаємо з файлу список активних модулів
private void readModulesFromFile(){
listModel.clear();
ResourceBundle bundle = null;
bundle = ResourceBundle.getBundle("m"/*, new Locale("ru", "RU")*/);
Enumeration modules = bundle.getKeys();
while (modules.hasMoreElements()) {
Integer moduleNumber = new Integer(modules.nextElement()+"");
String moduleDescription = bundle.getString(moduleNumber + "");
Module module = new Module(moduleNumber, moduleDescription);
activeModules.add(module);
listModel.addElement(module);}
list.setModel(listModel);}
public ParallelPort getParalellPort(){return ourParallelPort;}
public static void main(String[] args)
{JFrame frame = getMainFrame();
frame.show();}}
Клас ui.UserSettingsDialog
package dip.ui;
//імпорт необхідних пакетів
import java.awt.*;
import javax.swing.*;
//поля класу
private JButton okButton = new JButton();
private JButton cancelButton = new JButton();
private JTextField waitForResponseFld = new JTextField();
private JCheckBox isTestModuleCheck = new JCheckBox();
public class UserSettingsDialog extends JDialog {
public UserSettingsDialog(Frame owner) {
super(owner, "Настройки користувача", true);
try
{jbInit();
pack();}
catch(Exception ex) {
ex.printStackTrace();}}
//відображення графічного стану діалогу
private void jbInit() throws Exception {
this.getContentPane().setLayout(new FlowLayuout());
this.getContentPane().add(new JLabel("Тестовый режим"));
this.getContentPane().add(isTestModuleCheck);
this.getContentPane().add(new JLabel("Время ожидания милисекунд"));
this.getContentPane().add(waitForResponseFld);
this.getContentPane().add(cancelButton);
this.getContentPane().add(okButton);
//додаємо необхідні прослуховувачі
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
Helper.WaitForResponceInMilis = new Integer(waitForResponseFld.getText());//затримка для чекання
Helper.TEST_MODE = isTestModuleCheck.isSelected();//вибір режиму роботи з програмою}});
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
this.setVisible();}});}}
Клас util.BadEvent
package dip.util;
import java.awt.Component;
import javax.swing.JOptionPane;
public class BadEvent//власні оброблювачі помилок
{public static void throwCriticalEvent(Exception ex, Component sourse, String message)
{ex.printStackTrace();
JOptionPane.showMessageDialog(sourse, message);
System.exit(0);//у разі критичної помилки – виходимо з програми}
public static void throwNonCriticalEvent(Exception ex, Component sourse, String message)
{ex.printStackTrace();
JOptionPane.showMessageDialog(sourse, message);//у разі помилки видаємо повідомлення}}
Клас util.Helper
package dip.util;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
public class Helper {
public static int WaitForResponceInMilis = 10;//очикування відповіді
public static int syncroTime = 10000;//тривалість синхроімпульсу
public static int dataTime = 40000;//тривалість інформаційного рівня сигналу
public static boolean TEST_MODE = false;//наявність тестового режиму
public static byte[] integerToBytes(int number)
{byte [] bytes = new byte [16];
String str01 = Integer.toBinaryString(number);
int length = 16-str01.length();
for (int i = 0; i < length; i++) {
str01="0"+str01;//дописуємо (якщо необхідно) послідовність нулів}
for (int i = 0; i < str01.length(); i++)
{bytes[i] = Byte.parseByte(str01.substring(i, i+1));
System.err.print(""+bytes[i]);}
System.err.println("");
return bytes;}
public static byte [] testStringIntoBytes(int moduleNumber)
{ResourceBundle bundle = ResourceBundle.getBundle("TestValues");
byte [] bytes = new byte[Receiver.PACKAGE_SIZE];
String valueDigits = "";
try
{valueDigits = bundle.getString(moduleNumber + "");}
catch (Exception ex) {return null;}
StringTokenizer token = new StringTokenizer(valueDigits);
int k = 0;
int tokenCount = 0;
while (token.hasMoreTokens()){
Integer value = new Integer(token.nextToken());//розбір тестової строки
byte [] b = integerToBytes(value.intValue());
for (int i = 0; i < b.length; i++)
{// System.err.println("i+k="+(i+k)+" i="+i+" k="+k+" moduleNumber="+moduleNumber);
bytes[i+k] = b[i+1];//для подачі відповідних сигналів на DR0, DR1}
k = k+16;
tokenCount++;
if (tokenCount > 7) break;//перевірка, якщо проаналізували тестову строку}
// for (int i = 0; i < bytes.length; i++) {
// System.err.print(bytes[i]);
//}
return bytes;}
public static void main(String[] args) {
// integerToBytes(255);
testStringIntoBytes((byte)2);}}
Клас util.Receiver
package dip.util;
import java.io.*;
import javax.swing.JFrame;
import javax.comm.ParallelPort;
public class Receiver extends Thread{//даний клас є потоком
public static final int PACKAGE_SIZE = 1;//размер читаемого пакета
private InputStream in = null;
private ParallelPort parallelPort = null;
private JFrame owner = null;
private static Receiver receiver = null;
public byte [] buffer = new byte [PACKAGE_SIZE];//вхідний буфер даних
private int startCounter = 0;
public int counter = 0;
private Receiver()
{}
public static Receiver getInstanse()//тримаємо лише один активний екземпляр класу
{if (receiver.isAlive()) return receiver;
receiver = new Receiver();
return receiver;}
private byte readByte()//читання байту (біту) з паралельного порту
{byte b = 0;
if (parallelPort.isPaperOut())//якщо є синхроімпульс
{b = (parallelPort.isBusy())? 1: 0;//читаємо
parallelPort.setPaperOut(true);//скидуємо сигнал синхроімпульсу}
return b;}
public void run()
{while (true) {
byte currentByte = 0;
currentByte = readByte();
if (currentByte == 1) startCounter++;
else startCounter = 0;
if (startCounter == 7) {//якщо пройшла стартова послідовність
buffer[counter++] = b;
if (counter == PACKAGE_SIZE) {//якщо буфер повний
this.interrupt();}
try
{Thread.sleep(0, 100);//затримка у 0,1 мкс для звільнення процесорного часу}
catch (InterruptedException e) {}}}}
public void setIn(InputStream in) {
this.in = in;}
public JFrame getOwner() {
return owner;}
public void setOwner(JFrame owner) {
this.owner = owner;}
public void setParalellPort(ParallelPort parallelPort) {
this.parallelPort = parallelPort;}
public byte [] getBuffer() {return buffer;}}
Клас util.Transmitter
package dip.util;
import javax.comm.ParallelPortEventListener;
import javax.comm.CommPortOwnershipListener;
import javax.comm.ParallelPortEvent;
import java.io.OutputStream;
import javax.comm.ParallelPort;
import java.io.*;
import javax.swing.JOptionPane;
import javax.swing.JFrame;
public class Transmitter {
private static Transmitter transmitter = null;
private JFrame owner = null;
private OutputStream out = null;
private ParallelPort parallelPort = null;
public static final int PACKAGE_SIZE = 8;//довжина пакету, що посилається
public static final int SYNCROCOUNT = 8;//кількість підзаряжувальних синхроімпульсів
public static Transmitter getInstance()//маємо лише один екземпляр класу
{if (transmitter!= null) return transmitter;
transmitter = new Transmitter();
return transmitter;}
private Transmitter()
{}
public OutputStream getOut() {
return out;}
public void setOut(OutputStream out) {
this.out = out;}
public void sendBytes (byte [] byte01)
{doStartQuery();//спочатку передаємо стартову послідовність
for (int i = 0; i < byte01.length; i++)
sendByte(byte01[i]);}
private void sendByte(byte b)
{try
{this.getOut().write(b);//запис до відповідного регістру
try { Thread.sleep(0, Helper.dataTime); } catch (InterruptedException ex) { }//встановлюємо затримку
sendSyncro();//посилаємо синхроімпульс}
catch (IOException ex)
{ex.printStackTrace();
System.err.println("Не могу записать в параллельный порт!");}}
private void sendSyncro()
{this.parallelPort.setInputSelect(true);//встановлюємо сигнал
try { Thread.sleep(0, Helper.syncroTime); } catch (InterruptedException ex) { }//затримка
this.parallelPort.setInputSelect(false);//скидаємо сигнал}
private void doStartQuery()
{for (int i = 0; i < 8; i++)//спочатку синхроімпульси
sendByte((byte)0);
for (int i = 0; i < 8; i++)//потім – послідовність «одиниць»
sendByte((byte)1);}
private void writeTestQuery(byte [] testBytes)
{if (testBytes.length!= Receiver.PACKAGE_SIZE + 8)
{ System.err.println("Неспівпадння довжини пакету");
return;}
for (int i = 0; i < testBytes.length; i++)
{parallelPort.setPaperOut(testBytes[i]==2);//пишемо «1» якщо 2, інакше – «0»
try { Thread.sleep(0, Helper.dataTime); } catch (InterruptedException ex) { }
parallelPort.setPaperOut(false);
//задання синхронмульсу
parallelPort.setPaperOut(true);
try { Thread.sleep(0, Helper.syncroTime); } catch (InterruptedException ex) { }
parallelPort.setPaperOut(false);}}
public JFrame getOwner() {
return owner;}
public void setOwner(JFrame owner) {
this.owner = owner;}
public void setParallelPort(ParallelPort parallelPort) {
this.parallelPort = parallelPort;}}
Клас obj.WeatherData
package dip.obj;
import dip.util.Helper;
public class WeatherData
{private int temperature = 0;
private int presure = 0;
private int wind1 = 0;
private int wind2 = 0;
private int wind3 = 0;
Double realTemperature;//температура
Integer realPresure;//тиск
Double realWindDirection;//напрямок вітру
Double realWindPower;//сила вітру
int src = 0;
public int moduleNumber = 0;
byte [] bTemperature = new byte[16];
byte [] bPresure = new byte[16];
byte [] bWind1 = new byte[16];
byte [] bWind2 = new byte[16];
byte [] bWind3 = new byte[16];
byte [] bSrc = new byte[16];
byte [] bModuleNumber = new byte[8];
byte [] receivedBytes;
public WeatherData(byte [] receivedBytes)
{this.receivedBytes = receivedBytes;
initValues();}
private void initValues()//аналіз прийнятої послідовності
{for (int i = 0; i < receivedBytes.length; i++)
{receivedBytes[i]+=Receiver.PACKAGE_SIZE;
if (i>=0 && i<=7) bModuleNumber[i] = receivedBytes[i];
if (i>=8 && i<=23) bTemperature[i-8] = receivedBytes[i];
if (i>=24 && i<=39) bPresure[i-24] = receivedBytes[i];
if (i>=40 && i<=55) bWind1[i-56] = receivedBytes[i];
if (i>=56 && i<=71) bWind2[i-72] = receivedBytes[i];
if (i>=72 && i<=87) bWind3[i-72] = receivedBytes[i];
if (i>=88 && i<=103) bSrc[i-104] = receivedBytes[i];}
moduleNumber = Integer.parseInt(new String(bModuleNumber), 2);
temperature = Integer.parseInt(new String(bTemperature), 2);
presure = Integer.parseInt(new String(bPresure), 2);
wind1= Integer.parseInt(new String(bWind1), 2);
wind2 = Integer.parseInt(new String(bWind2), 2);
wind3 = Integer.parseInt(new String(bWind3), 2);
src = Integer.parseInt(new String(bSrc), 2);
reliveValues();}
public void reliveValues()
{if (checkSrc())
{if (temperature > 61440)//1111 0000 0000 0000 якщо мінусова температура
{temperature = temperature << 4;
temperature = 0 - temperature;}
realTemperature = new Double(temperature/16);
realPresure = new Integer(presure);
double w1, w2,w3, s1,s2;
w1 = windFunction(wind1);
w2 = windFunction(wind2);
w3 = windFunction(wind3);//обчислення показників за формулою
s1 = w1*Math.cos(Math.pi*0)+w2*Math.cos(Math.pi*(-2/3))+w2*Math.cos(Math.pi*(2/3));//a1+a2+a3
s2 = w1*Math.sin(Math.pi*0)+w2*Math.sin(Math.pi*(-2/3))+w2*Math.sin(Math.pi*(2/3));//b1+b2+b3
realWindPower = new Double(Math.sqrt(s1*s1+s2*s2));//знаходимо силу вітру
realWindDirection = new Double(Math.arctg(s2/s1));// та напрямок}}
private double windFunction(double chastota)
{if (chastota > 2) /обчислення показників за формулою
return (double)(1.614878*Math.sqrt(198.304-49.5759*f*f));
else return (double)(1.614878*Math.sqrt(49.5759*f*f-198.304));}
public boolean checkSrc()
{return (src == (temperature ^ presure ^ windPower ^ windDirection));//перевірка контрольної суми}
public Integer getRealPresure() {
return realPresure;}
public Double getRealTemperature() {
return realTemperature;}
public Integer getRealWindDirection() {
return realWindDirection;}
public Double getRealWindPower() {
return realWindPower;}
public void setRealPresure(Integer realPresure) {
this.realPresure = realPresure;}
public void setRealTemperature(Double realTemperature) {
this.realTemperature = realTemperature;}
public void setRealWindDirection(Integer realWindDirection) {
this.realWindDirection = realWindDirection;}
public void setRealWindPower(Double realWindPower) {
this.realWindPower = realWindPower;}
public static void main(String[] args) {
System.err.println(55^144^85^10);
System.err.println(48^93^15^78);
System.err.println(255^13^2^7);
System.err.println(77^66^34^32);
System.err.println(217^207^105^35);
System.err.println(56^199^201^124);
System.err.println(43^14^1^91);
System.err.println(165^222^15^204);
System.err.println(8^92^104^6);
System.err.println(31^101^206^6);
System.err.println(13^17^19^23);
System.err.println(57^75^209^200);
System.err.println(78^232^223^206);
System.err.println(5^0^85^5);
System.err.println(2^7^0^6);}}
Клас obj.Module
package dip.obj;
import dip.util.Transmitter;
import dip.util.Helper;
import javax.swing.JOptionPane;
public class Module
{private Integer moduleNumber = null;//номер модуля
private String moduleDescription = null;//його опис
private WeatherData weatherData;//показники з модуля
public Module(Integer moduleNumber)
{setModuleNumber(moduleNumber);}
public Module(Integer moduleNumber, String moduleDescription)
{setModuleNumber(moduleNumber);
this.moduleDescription = moduleDescription;}
public Integer getModuleNumber() {
return moduleNumber;}
public void setModuleNumber(Integer moduleNumber) {
this.moduleNumber = moduleNumber;}
public void sendModuleNumber()//посилка номера модуля (запит)
{Transmitter t = Transmitter.getInstance();
t.sendBytes(Helper.integerToBytes(this.moduleNumber.intValue()));}
public void createWeatherData(byte [] recivedBytes)throws Exception
//побудова екземпляру класу даних про погоду WeatherData – дані, отримані з модуля
{this.weatherData = new WeatherData(recivedBytes);
if (weatherData.moduleNumber!= getModuleNumber().intValue())
throw new Exception("Несовпадение номера модуля");}
public WeatherData getWeatherData() {
return weatherData;}
public String getModuleDescription() {
return moduleDescription;}
public void setModuleDescription(String moduleDescription) {
this.moduleDescription = moduleDescription;}
public String toString(){
return getModuleNumber() + " ("+getModuleDescription()+")";//для відображення модуля}}