Пример объектно-ориентированного проектирования: метеорологическая станция

advertisement
Пример объектно-ориентированного
проектирования: метеорологическая
станция
Требования к метеорологической станции
Система должна обеспечивать автоматический
мониторинг следующих первичных погодных
параметров:




скорость и направление ветра;
температура;
барометрическое давление;
влажность воздуха.
Система также должна вычислять некоторые
производные параметры, в число которых
входят:




коэффициент резкости погоды;
точка росы;
относительное изменение температуры;
относительное изменение барометрического
давления.
Требования к метеорологической станции



В системе должна быть предусмотрена
возможность определения текущего
времени и даты
Система должна обеспечивать
постоянный вывод на дисплей текущих
значений всех первичных и производных
параметров, их максимальных и
минимальных значений, а также время и
дату
Система должна позволять проводить
калибровку датчиков, а также
устанавливать время и дату
Требования к метеорологической станции



В системе должна быть предусмотрена
возможность определения текущего
времени и даты
Система должна обеспечивать
постоянный вывод на дисплей текущих
значений всех первичных и производных
параметров, их максимальных и
минимальных значений, а также время и
дату
Система должна позволять проводить
калибровку датчиков, а также
устанавливать время и дату
Предположения об аппаратной части







Используется обычный персональный компьютер
Системные время и дата поддерживаются встроенными
часами
Температура, давление и влажность определяются
встроенными контроллерами, которые соединены с
соответствующими датчиками
Направление ветра измеряется с помощью флюгера с
точностью до одного из 16 направлений; скорость ветра
определяется анемометром со счетчиком оборотов
Ввод команд пользователем осуществляется с помощью
клавишной панели
Экраном служит жидкокристаллический дисплей
Встроенный таймер посылает прерывания через каждую
1/60 долю секунды
Состав аппаратной части
Класс времени и даты
Имя:
TimeDate
Ответственность:
Поддержание информации о текущих времени и дате
Операции:
currentTime - текущее время
currentDate - текущая дата
setFormat - установка формата
setHour - установка часа
setMinute - установка минут
setSecond - установка секунд
setMonth - установка месяца
setDay - установка дня
setYear - установка года
Атрибуты:
time - время
date - дата
Класс температурный датчик
Имя:
TemperatureSensor
Ответственность:
Поддержание информации о текущей температуре
Операции:
currentTemperature - текущая температура
setLowTemperature - установка минимальной температуры
setHighTemperature - установка максимальной температуры
Атрибуты:
temperature - температура
Класс датчик давления
Имя:
PressureSensor
Ответственность:
Поддержание информации о текущем давлении
Операции:
currentPressure - текущее давление
setLowPressure - установка минимального давления
setHighPressure - установка максимального давления
Атрибуты:
pressure - давление
Класс определения тренда
Имя:
TrendSensor
Ответственность:
Определение тренда давления или температуры как наклона
графика (от -1 до 1) изменения их значений за данный
интервал времени
Операции:
trend - тренд
Класс датчик влажности
Имя:
HumiditySensor
Ответственность:
Поддержание информации о текущей влажности,
выраженной в процентах от 0% до 100%
Операции:
currentHumidity - текущая влажность
setLowHumidity - установка минимальной влажности
setHighHumidity - установка максимальной влажности
Атрибуты:
humidity - влажность
Класс для минимальных и
максимальных значений параметров
Имя:
HistoricalSensor
Ответственность:
Генерация сообщений о максимальных и минимальных
значениях параметров за 24-часа
Операции:
highValue - максимальное значение
lowValue - минимальное значение
timeOf HighValue - время, соответствующее максимальному
значению
timeOfLowValue - время, соответствующее минимальному
значению
Класс датчик скорости ветра
Имя:
WindSpeedSensor
Ответственность:
Поддержание информации о скорости ветра
Операции:
currentSpeed - текущая скорость
setLowSpeed - установка минимальной скорости
setHighSpeed - установка максимальной скорости
Атрибуты:
speed - скорость
Класс калибровки измеренных
значений
Имя:
CalibratingSensor
Ответственность:
Обеспечение линейной интерполяции значений, лежащих в
известном интервале
Операции:
currentValue - текущее значение
setLowValue - установка минимального значения
setHighValue - установка максимального значения
Класс датчик направления ветра
Имя:
WindDirectionSensor
Ответственность:
Поддержание информации о текущем направлении ветра,
указываемом как точка на розе ветров
Операции:
currentDirection - текущее направление
Атрибуты:
direction - направление
Иерархия классов датчиков
Класс для ввода с клавиатуры
Имя:
Keypad
Ответственность:
Поддержание информации о коде последней клавиши,
нажатой на клавиатуре
Операции:
lastKeyPress - последняя нажатая клавиша
Атрибуты:
key - клавиша
Класс для дисплея
Класс для дисплея
Имя:
LCDDevice
Ответственность:
Управление выводом на экран графических элементов
Операции:
drawText - рисовать текст
drawLine - рисовать линию
drawCircle - рисовать окружность
setTextSize - установка размера текста
setTextStyle - установка начертания текста
setPenSize - установка ширины линии
Класс для таймера
Имя:
Timer
Ответственность:
Осуществление прерываний и диспетчеризация функций
обратного вызова
Операции:
setCallback() - установка функции обратного вызова
Список ситуаций









Мониторинг первичных измеряемых параметров: скорости и
направления ветра, температуры, барометрического давления
и влажности.
Мониторинг производных параметров: коэффициента
жесткости погоды, точки образования росы, трендов
температуры и барометрического давления.
Показ максимальных и минимальных значений выбранных
параметров.
Установка времени и даты.
Калибровка выбранных датчиков.
Включение системы.
Добавим еще две дополнительные ситуации:
Отказ питания.
Отказ датчика.
Мониторинг
Частоты снятия информации:

каждые 0.1 секунды направление ветра

каждые 0.5 секунды скорость ветра

каждые 5 минут температура, давление и влажность
Класс Sampler обеспечивает требуюмую частоту снятия
информации
Класс для дисплея
Имя:
LCDDevice
Ответственность:
Управление выводом на экран графических элементов
Операции:
drawText - рисовать текст
drawLine - рисовать линию
drawCircle - рисовать окружность
setTextSize - установка размера текста
setTextStyle - установка начертания текста
setPenSize - установка ширины линии
Атрибуты:
key - клавиша
Реализация вывода параметров на экран
Имя:
DisplayManager
Ответственность:
Организация отображения параметров на экране дисплея
Операции:
drawStaticItems - рисование статических элементов
displayTime - вывод времени
displayDate - вывод даты
displayTemperature - вывод температуры
displayHumidity - вывод влажности
displayPressure - вывод давления
displayWindChill - вывод коэффициента жесткости погоды
displayDewPoint - вывод точки росы
displayWindSpeed - вывод скорости ветра
displayWindDirection - вывод направления ветра
displayHighLow - вывод максимальных и минимальных
значений
Связи между классами, связанными
с выводом информации на экран
Вторичные параметры
Класс для управления клавиатурой
Имя:
InputManager
Ответственность:
Диспетчеризация команд пользователя
Операции:
processKeyPress - обработка сигналов с клавиатуры
Архитектура системы мониторинга погоды
Код классов Sensors и Sampler
public enum SensorName {
Direction, Speed, WindChill, Temperature,
DewPoint, Humidity, Pressure;
}
class Sensors extends ArrayList {
public void addSensor(SensorName sensor, int id);
public int numberOfSensors();
public int numberOfSensors(SensorName sensor);
public Sensor& sensor(SensorName, int id);
}
class Sampler {
Sensors rSensors;
DisplayManager rDisplayManager;
public void sample(Tick t) {
for (SensorName name = Direction; name <= Pressure; name++)
for (int id = 0; id < rSensors.numberOfSensors(name); id++)
if (!(t % samplingRate(name)))
rDisplayManager.display(
rSensors.sensor(name, id).currentValue(),
name, id);
}
}
Код классов CalibratingSensor,
HistoricalSensor и TrendSensor
class CalibratingSensor extends Sensor {
CalibratingSensor(SensorName sensor, int id);
public void setHighValue(float x, float y);
public void setLowValue(float x, float y);
public float currentValue();
public float rawValue();
}
class HistoricalSensor extends CalibratingSensor {
HistoricalSensor(SensorName sensor, int id);
public float highValue();
public float lowValue();
public String timeOfHighValue();
public String timeOfLowValue();
}
class TrendSensor extends HistoricalSensor {
TrendSensor(SensorName sensor, int id);
public float trend();
}
Download