[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/metar 88ae024 04/16: Use calc-units to convert units to
From: |
Stefan Monnier |
Subject: |
[elpa] externals/metar 88ae024 04/16: Use calc-units to convert units to a user-defined setting (WIP) |
Date: |
Sat, 28 Nov 2020 23:16:36 -0500 (EST) |
branch: externals/metar
commit 88ae02423264c75c74d562ae5ccf6d2fe3bdad00
Author: Mario Lang <mlang@delysid.org>
Commit: Mario Lang <mlang@delysid.org>
Use calc-units to convert units to a user-defined setting (WIP)
Covers wind speed and air pressure for now, more to come.
---
metar.el | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
diff --git a/metar.el b/metar.el
index 43a72db..5c4410a 100644
--- a/metar.el
+++ b/metar.el
@@ -36,11 +36,15 @@
;;; Code:
+(require 'calc)
+(require 'calc-units)
(require 'cl-lib)
(require 'rx)
(require 'solar)
(require 'url)
+(defvar metar-units '((speed . kph) (pressure . bar)))
+
(defvar metar-stations-info-url "http://weather.noaa.gov/data/nsd_bbsss.txt"
"URL to use for retrieving station meta information.")
@@ -217,8 +221,6 @@ record.")
REturn a cons where `car' is the time of the measurement (as an emacs-lsip
time value) and `cdr' is a string containing the actual METAR code.
If no record was found for STATION, nil is returned."
- (unless (string-match "^[A-Z][A-Z0-9][A-Z0-9][A-Z0-9]$" station)
- (signal 'error "Invalid station code"))
(with-temp-buffer
(url-insert-file-contents (metar-url station))
(when (re-search-forward (format metar-record-regexp station) nil t)
@@ -331,9 +333,9 @@ If no record was found for STATION, nil is returned."
(when (and (match-string 4 info) (match-string 5 info))
(list :from (metar-degrees (string-to-number (match-string 4
info)))
:to (metar-degrees (string-to-number (match-string 5
info)))))))
- (list :speed (metar-knots (string-to-number (match-string 2 info))))
+ (list :speed (metar-convert-unit (concat (match-string 2 info) "knot")
(cdr (assq 'speed metar-units))))
(when (match-string 3 info)
- (list :gusts (metar-knots (string-to-number (match-string 3 info))))))))
+ (list :gust (metar-convert-unit (concat (match-string 3 info) "knot")
(cdr (assq 'speed metar-units))))))))
(defconst metar-visibility-regexp
(rx symbol-start (group (1+ digit)) (optional (group "SM")) symbol-end))
@@ -367,8 +369,12 @@ If no record was found for STATION, nil is returned."
(defun metar-pressure (info)
(when (string-match metar-pressure-regexp info)
- (cons (string-to-number (match-string 2 info))
- (if (string= (match-string 1 info) "Q") 'hPa 'inHg))))
+ (metar-convert-unit (cond
+ ((string= (match-string 1 info) "Q")
+ (concat "(" (match-string 2 info) " / 1000) bar"))
+ ((string= (match-string 1 info) "A")
+ (concat "(" (match-string 2 info) " / 100) inHg")))
+ (cdr (assq 'pressure metar-units)))))
(defun metar-decode (record)
"Return a lisp structure describing the weather information in RECORD."
@@ -504,5 +510,21 @@ Otherwise, determine the best station via
latitude/longitude."
(when (> count 0)
(/ (float temp-sum) count)))))
+(defun metar-convert-unit (value new-unit)
+ "Convert VALUE to NEW-UNIT.
+VALUE is a string with the value followed by the unit, like \"5 knot\"
+and NEW-UNIT should be a unit name like \"kph\" or similar."
+ (cl-check-type value string)
+ (cl-check-type new-unit (or string symbol))
+ (cl-multiple-value-bind (value unit)
+ (split-string
+ (math-format-value
+ (math-convert-units (math-simplify (math-read-expr value))
+ (math-read-expr (cl-etypecase new-unit
+ (string new-unit)
+ (symbol (symbol-name
new-unit))))))
+ " ")
+ (cons (string-to-number value) (intern unit))))
+
(provide 'metar)
;;; metar.el ends here
- [elpa] branch externals/metar created (now 3b05cb3), Stefan Monnier, 2020/11/28
- [elpa] externals/metar b8949ce 02/16: Fix phenomena decoding, Stefan Monnier, 2020/11/28
- [elpa] externals/metar c45aa82 05/16: [metar] Make the length unit configurable (clouds) and simplify pressure conversion, Stefan Monnier, 2020/11/28
- [elpa] externals/metar 88ae024 04/16: Use calc-units to convert units to a user-defined setting (WIP),
Stefan Monnier <=
- [elpa] externals/metar ab9604e 07/16: [metar] Fix humidity calculation when Fahrenheit is used, Stefan Monnier, 2020/11/28
- [elpa] externals/metar 7307c42 01/16: Add metar.el., Stefan Monnier, 2020/11/28
- [elpa] externals/metar 258272f 13/16: * packages/metar/metar.el: Bump version for last two changes., Stefan Monnier, 2020/11/28
- [elpa] externals/metar e0b58d1 12/16: Add a work-around for bug#19582, present before Emacs 24.5., Stefan Monnier, 2020/11/28
- [elpa] externals/metar 5b8b9b7 14/16: Adjust for NOAA server changes., Stefan Monnier, 2020/11/28
- [elpa] externals/metar 3b05cb3 16/16: * .gitignore: New file, Stefan Monnier, 2020/11/28
- [elpa] externals/metar 8c6596d 03/16: * packages/metar/metar.el (metar-latitude-longitude-distance-haversine):, Stefan Monnier, 2020/11/28
- [elpa] externals/metar e1a8e1c 08/16: [metar] Fix metar-convert-temperature to actually DTRT, Stefan Monnier, 2020/11/28
- [elpa] externals/metar e891727 09/16: [metar] Unify station lat/lon conversion., Stefan Monnier, 2020/11/28
- [elpa] externals/metar 0f998f5 06/16: [metar] defcustom for metar-units, Stefan Monnier, 2020/11/28