Skip to content

Instantly share code, notes, and snippets.

@a-dminator
Created March 31, 2019 16:20
Show Gist options
  • Save a-dminator/2057632eebc6d82ea77e76fac8e96989 to your computer and use it in GitHub Desktop.
Save a-dminator/2057632eebc6d82ea77e76fac8e96989 to your computer and use it in GitHub Desktop.
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart';
class Detector {
// Географические координаты датчика
double lat; // Широта
double lon; // Долгота
int toxicity; // Токсичность в условных единицах
int partials; // Содержание частиц в условных единицах
double pressure; // Атмосферное давление
double windSpeed; // Скорость ветра в данный момент в метрах в секунду
double humidity; // Влажность
double temperature; // Температуры в градусах цельсия
DangerLevel dangerLevel; // Условный уровень опасности
Detector(this.lat, this.lon, this.toxicity, this.partials, this.pressure,
this.windSpeed, this.humidity, this.dangerLevel, this.temperature);
}
enum DangerLevel { low, medium, high }
/// Случай использования "Получение информации с датчиков"
///
/// Описывает, каким образом пользователь может получить данные с датчиков,
/// установленных компание Infinnity
class GetDetectorsUseCase {
Future<List<Detector>> call() async {
// Получение данных от API компании Infinnity
final infinnityApiResponse = await _callInfinnityApi();
// Получение сведений с датчиков компании Infinnity
final infinnityDetectors = _getDetectors(infinnityApiResponse);
// Преобразование информации с датчиков из формата
// компании Infinnity - в формат предметной области приоржения
final domainDetectors = infinnityDetectors.map((infinnityDetector) {
// Получение координат
var lat = getNumber(infinnityDetector, "eco_lat");
var lon = getNumber(infinnityDetector, "eco_lon");
// Получение уровня загрязнения
int toxicity = infinnityDetector["eco_sds_p1"] ?? 27;
// Получение уровня содержания частиц
int partials = infinnityDetector["eco_sds_p2"] ?? 17;
// Получение атмосферного давления
var pressure = getNumber(infinnityDetector, "eco_pressure");
// Получение температуры
var temperature = getNumber(infinnityDetector, "eco_ds18b20_temperature");
// Получение скорости ветра
var windSpeed = getNumber(infinnityDetector, "eco_wind_speed");
// Получение влажности
var humidity = getNumber(infinnityDetector, "eco_wind_speed");
// Коэффициент, на который необходимо умножить уровень содержания
// частиц для выравнивания его веса в общих рассчётах
const partialsMultiplier = 1.8;
// Рассчёт коэффициента загрязнённости. Эта формула будет меняться
// с получением новых данных
final dangerCof = toxicity + (partials * partialsMultiplier);
// Приведение коэффициента загрязнённости к условному уровню
// загрязнённости
DangerLevel dangerLevel;
if (dangerCof > 20)
dangerLevel = DangerLevel.high;
else if (dangerCof > 10)
dangerLevel = DangerLevel.medium;
else
dangerLevel = DangerLevel.low;
return Detector(
lat,
lon,
toxicity,
partials,
pressure,
windSpeed,
humidity,
dangerLevel,
temperature,
);
}).toList();
return domainDetectors;
}
}
// ==============================================================
// Далее идут низкоуровневые детали, не описывающие бизнес-логику
// ==============================================================
double getNumber(Map<String, dynamic> json, String key) {
String stringValue = json[key]?.toString();
if (stringValue != null) {
return double.parse(stringValue);
} else {
return null;
}
}
List _getDetectors(String apiResponse) => jsonDecode(apiResponse);
Future<String> _callInfinnityApi() async {
return get(
'<API_PATH>',
headers: {"authorization": "<API_KEY>"},
).then((response) => response.body);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment