Created
March 31, 2019 16:20
-
-
Save a-dminator/2057632eebc6d82ea77e76fac8e96989 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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