null, ]; public const URL = 'https://avwx.rest/api/metar/'; /** * Determine the category depending on the rules for visibility/ceiling * https://www.aviationweather.gov/cva/help * @param $metar * @return string */ protected function determineCategory($metar): string { $category = 'VFR'; $visibility = 10; // assume it's ok and VFR $vis = $metar->getVisibility(); if($vis) { $vis = $vis->getVisibility(); if($vis) { $visibility = $vis->getValue(); } } $ceiling = $metar->getClouds(); if ($ceiling && count($ceiling) > 0) { $ceiling = $ceiling[0]->getBaseHeight()->getValue(); } else { $ceiling = 1000; } if ($visibility < 3 || $ceiling < 1000) { $category = 'IFR'; } return $category; } /** * Attempt to get the data from the CheckWX API */ public function run() { /** * @var \App\Interfaces\Metar */ $klass = config('phpvms.metar'); $metar_class = new $klass; $raw_metar = $metar_class->get_metar($this->config['icao']); if(!$raw_metar || $raw_metar === '') { $category = null; $metar = null; } else { // Run through this parser $decoder = new MetarDecoder(); $metar = $decoder->parse($raw_metar); // Determine the flight category that's allowed // Just check if we need to be under IFR conditions $category = $this->determineCategory($metar); } return view('widgets.weather', [ 'config' => $this->config, 'category' => $category, 'metar' => $metar, 'unit_alt' => setting('units.altitude'), 'unit_dist' => setting('units.distance'), 'unit_temp' => setting('units.temperature'), ]); } }