Skip to content

AbobaCorp/SmartHomeKR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SmartHomeKR

Исходный код приложения "Умный дом" для курсовой работы

Исходный код

Нумерация листингов соответствует нумерации в приложении А, текстового документа курсовой

  • Листинг 1 – файл SmartHome.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

namespace SmartHome
{
    //комната с устройствами
    [Serializable]
    public class Room
    {
        private List<SmartHome.Device> _devices;

        public int CountDevice { get => _devices.Count; }
        public string Name { get; protected set; }
        public IEnumerable<Device> Devices { get => _devices; }

        public Room(string name)
        {
            Name = name;
            _devices = new List<SmartHome.Device>();
        }

        public void RenameRoom(string newName)
        {
            Name = newName;
        }

        public Device GetDevice(int index)
        {
            return _devices.ElementAt(index);
        }

        public void Add(SmartHome.Device device)
        {
            _devices.Add(device);
        }

        public bool Remove(SmartHome.Device device)
        {
            return _devices.Remove(device);
        }

        public bool Remove(SmartHome.DeviceId id)
        {
            foreach (SmartHome.Device device in _devices)
            {
                if (device.ID == id)
                {
                    Remove(device);
                    return true;
                }
            }
            return false;
        }
    }

    //id устройства
    [Serializable]
    public class DeviceId
    {
        private static int iter = 0;
        private int _id;

        public int ID { get => _id; }

        public DeviceId()
        {
            _id = iter;
            iter++;
        }

        private DeviceId(int id)
        {
            _id = id;
        }

        public static void IteratorRecovery(int iter)
        {
            DeviceId.iter = iter;
        }

        public static implicit operator DeviceId(string id)
        {
            return new DeviceId(Convert.ToInt32(id));
        }
        public static bool operator ==(DeviceId a, DeviceId b)
        {
            return a._id == b._id;
        }
        public static bool operator !=(DeviceId a, DeviceId b)
        {
            return a._id != b._id;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is DeviceId))
            {
                return false;
            }

            return this == (DeviceId)obj;
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public override string ToString()
        {
            return $"{_id:0000}";
        }
    }

    //устройство
    [Serializable]
    public abstract class Device
    {
        protected DeviceId _id;
        public string Name { get; protected set; }
        public bool Status { get; protected set; }
        public DeviceId ID { get => _id; }

        public Device()
        {
            _id = new DeviceId();
        }

        public virtual void TurnOn()
        {
            Status = true;
        }

        public virtual void TurnOff()
        {
            Status = false;
        }

        public void Rename(string newName)
        {
            Name = newName;
        }

        public virtual void Update() { }
    }

    //освещение
    [Serializable]
    public class Lighting : Device
    {
        public int Brightness { get; private set; }
        public Color Color { get; private set; }

        public Lighting(string name, int brightness, Color color) : base()
        {
            base.Name = name;
            Brightness = brightness;
            Color = color;

        }

        public void SetBrightness(int value)
        {
            Brightness = value;
        }
        public void SetColor(Color value)
        {
            Color = value;
        }
    }

    //термостат
    [Serializable]
    public class Thermostat : Device
    {
        private TemperatureSensor _curTemp;
        //текущая температупа
        public double CurrentTemperature { get => _curTemp.Temperature; }
        //желаемая температупа
        public double DesiredTemperature { get; protected set; }

        public Thermostat(string name, double DesiredTemperature) : base()
        {
            base.Name = name;
            this.DesiredTemperature = DesiredTemperature;
            _curTemp = new TemperatureSensor();
        }

        public virtual void SetTemperature(double value)
        {
            DesiredTemperature = value;
        }

        public override void Update()
        {
            _curTemp.Update();
        }
    }

    //теплый пол 
    [Serializable]
    public class WarmFloor : Thermostat
    {
        //площадь покрытия
        public (double, double) CoveragArea { get; set; }

        public WarmFloor(string name, double DesiredTemperature, (double, double) CoveragArea) : base(name, DesiredTemperature)
        {
            this.CoveragArea = CoveragArea;
        }
    }

    //камера
    [Serializable]
    public class Camera : Device
    {
        public (int, int) Resolution { get; private set; }
        public bool IsRecording { get; private set; }

        public Camera(string name, (int, int) resolution) : base()
        {
            base.Name = name;
            Resolution = resolution;
            IsRecording = false;
        }

        public void StartRecording()
        {
            IsRecording = true;
        }

        public void StopRecording()
        {
            IsRecording = false;
        }
    }

    //умный пылесос
    [Serializable]
    public class RobotVacuumCleaner : Device
    {
        private static Random random = new Random();
        public enum Tasks { cleans_up, charging, waiting }

        //заряд батареи %
        public int BatteryCharge { get; private set; }
        //ход работы %
        public int ProgressWork { get; private set; }
        //текущее задание
        public Tasks CurrentTask { get; private set; }

        public RobotVacuumCleaner(string name) : base()
        {
            base.Name = name;
            BatteryCharge = 100;
            ProgressWork = 0;
            CurrentTask = Tasks.waiting;
        }
        public override void Update()
        {
            BatteryCharge = random.Next(0, 4) == 0 ? random.Next(0, 16) : random.Next(0, 100);
            ProgressWork = random.Next(0, 4) == 0 ? 100 : random.Next(0, 100);

            if (ProgressWork == 100)
            {
                CurrentTask = Tasks.waiting;
            }
            else if (BatteryCharge <= 15)
            {
                CurrentTask = Tasks.charging;
            }
            else
            {
                CurrentTask = Tasks.cleans_up;
            }
        }
        public void SendCleanUp()
        {
            CurrentTask = Tasks.cleans_up;
        }
        public void SendCharging()
        {
            CurrentTask = Tasks.charging;
        }
        public void SendToBase()
        {
            CurrentTask = Tasks.waiting;
        }
    }

    //система безопасности
    [Serializable]
    public class SecuritySystem
    {
        public bool IsArmed { get; private set; }

        public SecuritySystem() => IsArmed = false;

        public void Arm()
        {
            IsArmed = true;
        }

        public void Disarm()
        {
            IsArmed = false;
        }
    }

    //датчик
    [Serializable]
    public abstract class Sensor
    {
        protected double value;
        protected static Random random = new Random();
        public abstract void Update();
    }

    //датчик температуры
    [Serializable]
    public class TemperatureSensor : Sensor
    {
        public double Temperature
        {
            get
            {
                return base.value;
            }
            private set
            {
                base.value = value;
            }
        }

        public TemperatureSensor()
        {
            Update();
        }

        public override void Update()
        {
            Temperature = Sensor.random.NextDouble() * 25 + 15;
        }

        public override string ToString()
        {
            return $"{Temperature:0.0} °C";
        }
    }

    //датчик давления
    [Serializable]
    public class PressureSensor : Sensor
    {
        public double Pressure
        {
            get
            {
                return base.value;
            }
            private set
            {
                base.value = value;
            }
        }

        public PressureSensor()
        {
            Update();
        }

        public override void Update()
        {
            Pressure = Sensor.random.Next(720, 780);
        }

        public override string ToString()
        {
            return $"{Pressure} мм рт. ст.";
        }
    }

    //датчик влажности
    [Serializable]
    public class HumiditySensor : Sensor
    {
        public double Humidity
        {
            get
            {
                return base.value;
            }
            private set
            {
                base.value = value;
            }
        }

        public HumiditySensor()
        {
            Update();
        }

        public override void Update()
        {
            Humidity = Sensor.random.Next(0, 101);
        }

        public override string ToString()
        {
            return $"{Humidity} %";
        }
    }

    //умная розетка
    [Serializable]
    public class SmartPlug : Device
    {
        //имя подключенного устройства
        public string NameConnectedDevice { get; private set; }

        public SmartPlug(string name, string nameConnectedDevice) : base()
        {
            base.Name = name;
            this.NameConnectedDevice = nameConnectedDevice;
        }
    }

    //ик-пульт
    [Serializable]
    public class IRRemoteControl : Device
    {
        private List<(DeviceId, string, bool)> _devices;

        public IEnumerable<(DeviceId, string, bool)> Devices { get => _devices; }

        public IRRemoteControl(string name) : base()
        {
            base.Name = name;
            base.Status = true;
            _devices = new List<(DeviceId, string, bool)>();
        }

        //добавить устройство
        public void Add(string nameDevice)
        {
            _devices.Add((new DeviceId(), nameDevice, false));
        }

        //удалить устройство по ID
        public bool Remove(DeviceId deviceId)
        {
            foreach (var device in _devices)
            {
                if (device.Item1 == deviceId)
                {
                    _devices.Remove(device);
                    return true;
                }
            }
            return false;
        }

        public void TurnOnDevice(DeviceId deviceId)
        {
            for (int i = 0; i < _devices.Count; i++)
            {
                if (_devices[i].Item1 == deviceId)
                {
                    _devices[i] = (_devices[i].Item1, _devices[i].Item2, true);
                }
            }
        }

        public void TurnOffDevice(DeviceId deviceId)
        {
            for (int i = 0; i < _devices.Count; i++)
            {
                if (_devices[i].Item1 == deviceId)
                {
                    _devices[i] = (_devices[i].Item1, _devices[i].Item2, false);
                }
            }
        }
    }

    //кондиционер
    [Serializable]
    public class AirConditioner : Thermostat
    {
        public AirConditioner(string name, double DesiredTemperature) : base(name, DesiredTemperature)
        {
        }
    }

    //штора
    [Serializable]
    public class Curtain : Device
    {
        public int Openness { get; private set; }

        public Curtain(string name) : base()
        {
            base.Name = name;
            base.Status = true;
            Openness = 0;
        }

        public bool Open(int percent)
        {
            if (percent > 0 && percent <= 100)
            {
                Openness = percent;
                return true;
            }
            return false;
        }

        public override void TurnOn()
        {
            Openness = 100;
        }
        public override void TurnOff()
        {
            Openness = 0;
        }
    }
}
  • Листинг 2 – файл SmartHome.Hub.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace SmartHome
{
    [Serializable]
    public class Hub
    {
        public int MaxDeviceIdIter { get; private set; }

        private TemperatureSensor _temperature;
        private PressureSensor _pressure;
        private HumiditySensor _humidity;
        private List<Room> _rooms;

        public string Name { get; private set; }
        public TemperatureSensor Temperature { get => _temperature; }
        public PressureSensor Pressure { get => _pressure; }
        public HumiditySensor Humidity { get => _humidity; }
        public SecuritySystem SecuritySystem { get; private set; }
        private DateTime _time;
        public DateTime Time
        {
            get => _time;
            set
            {
                _time = value;
                _time = _time.AddMinutes(-(_time.Minute % 10));
            }
        }
        public int CountRoom { get => _rooms.Count; }
        public IEnumerable<Room> Rooms { get => _rooms; }

        public Hub(string name)
        {
            _temperature = new TemperatureSensor();
            _pressure = new PressureSensor();
            _humidity = new HumiditySensor();

            _rooms = new List<Room>();

            SecuritySystem = new SecuritySystem();
            _time = DateTime.Now;
            _time = _time.AddMinutes(-(_time.Minute % 10));
            Name = name;
        }

        //переименовать Hub
        public void Rename(string newName)
        {
            Name = newName;
        }

        //обновление метеоданных
        public void UpdateWeatherData()
        {
            _temperature.Update();
            _pressure.Update();
            _humidity.Update();
        }

        //обновление времени
        public void UpdateTime()
        {
            _time = _time.AddMinutes(5);
        }

        //обновление всех устройств
        public void UpdateAllDevices()
        {
            foreach (var i in Rooms)
            {
                foreach (var j in i.Devices)
                {
                    j.Update();
                }
            }
        }

        //оновление MaxDeviceIdIter
        public void UpdateMaxDeviceIdIter()
        {
            MaxDeviceIdIter = 0;
            foreach (var i in Rooms)
            {
                foreach (var j in i.Devices)
                {
                    if (MaxDeviceIdIter < j.ID.ID)
                    {
                        MaxDeviceIdIter = j.ID.ID;
                    }
                }
            }
        }

        //добавление комнаты
        public bool AddRoom(string nameRoom)
        {
            foreach (var item in _rooms)
            {
                if (item.Name == nameRoom)
                {
                    return false;
                }
            }

            Room newRoom = new Room(nameRoom);
            _rooms.Add(newRoom);
            RoomAdded?.Invoke(newRoom);
            return true;
        }

        //удаление комнаты
        public bool RemoveRoom(string nameRoom)
        {
            for (int i = 0; i < _rooms.Count; i++)
            {
                if (_rooms[i].Name == nameRoom)
                {
                    RoomRemoved?.Invoke(_rooms[i]);
                    _rooms.RemoveAt(i);
                    return true;
                }
            }

            return false;
        }

        public bool RemoveRoomAt(int index)
        {
            if (index >= 0 && index < _rooms.Count)
            {
                RoomRemoved?.Invoke(_rooms[index]);
                _rooms.RemoveAt(index);
                return true;
            }

            return false;
        }

        //добавление устройства в заданную комнату
        public bool AddDevice(string nameRoom, Device device)
        {
            foreach (var room in _rooms)
            {
                if (room.Name == nameRoom)
                {
                    room.Add(device);
                    DeviceAdded?.Invoke(room, device);
                    return true;
                }
            }

            return false;
        }

        //удаление устройства
        public bool RemoveDevice(string nameRoom, DeviceId id)
        {
            foreach (var i in _rooms)
            {
                if (i.Name == nameRoom)
                {
                    foreach (var j in i.Devices)
                    {
                        if (j.ID == id)
                        {
                            DeviceRemoved?.Invoke(i, j);
                            i.Remove(j);
                            return true;
                        }
                    }
                }
            }
            return false;
        }

        public bool RemoveDevice(DeviceId id)
        {
            foreach (var i in _rooms)
            {
                foreach (var j in i.Devices)
                {
                    if (j.ID == id)
                    {
                        DeviceRemoved?.Invoke(i, j);
                        i.Remove(j);
                        return true;
                    }
                }
            }
            return false;
        }

        //получить комнату по имени
        public Room GetRoom(string nameRoom)
        {
            for (int i = 0; i < _rooms.Count; i++)
            {
                if (_rooms[i].Name == nameRoom)
                {
                    return _rooms[i];
                }
            }

            return null;
        }

        //получить комнату по адресу
        public Room GetRoomAt(int index)
        {
            if (index >= 0 && index < _rooms.Count)
            {
                return _rooms[index];
            }
            return null;
        }

        //Получить устройство по ID
        public Device GetDevice(DeviceId deviceId, bool isChange = false)
        {
            foreach (var room in _rooms)
            {
                foreach (var device in room.Devices)
                {
                    if (device.ID == deviceId)
                    {
                        if (isChange)
                        {
                            DeviceChanged?.Invoke(room, device);
                        }
                        return device;
                    }
                }
            }
            return null;
        }

        public Device GetDeviceAt(string nameRoom, int index, bool isChange = false)
        {
            for (int i = 0; i < _rooms.Count; i++)
            {
                if (_rooms[i].Name == nameRoom)
                {
                    Device device = _rooms[i].GetDevice(index);
                    if (isChange)
                    {
                        DeviceChanged?.Invoke(_rooms[i], device);
                    }
                    return device;
                }
            }

            return null;
        }

        //сохранение данных в файл
        public static void SaveHubToFile(Hub hub, string filePath)
        {
            BinaryFormatter formatter = new BinaryFormatter();

            using (Stream stream = File.Open(filePath, FileMode.Create))
            {
                formatter.Serialize(stream, hub);
            }
        }

        //загрузка данных из файла
        public static Hub LoadObjectFromFile(string filePath)
        {
            if (!File.Exists(filePath)) return null;

            BinaryFormatter formatter = new BinaryFormatter();

            using (Stream stream = File.OpenRead(filePath))
            {
                return (Hub)formatter.Deserialize(stream);
            }
        }

        //события
        public delegate void DeviceHandler(Room room, Device device);
        public event DeviceHandler DeviceAdded;
        public event DeviceHandler DeviceRemoved;
        public event DeviceHandler DeviceChanged;

        public delegate void RoomHandler(Room room);
        public event RoomHandler RoomAdded;
        public event RoomHandler RoomRemoved;
    }
}

Примеры работы приложения

About

Курсовая работа

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages