(defpackage :klmnea (:use :common-lisp) (:export #:process-nmea #:process-nmeassage #:defnmeassage)) (in-package klmnea) (defclass nmeassage () ()) (defmethod process-nmeassage ((message nmeassage)) (values)) (defun slot-names (lst) (let ((vals (mapcar #'(lambda (part) (mapcar #'car part)) lst))) (values (apply #'append vals) vals))) (defun unmearshall (type form) (case type (:integer `(ignore-errors (parse-integer ,form :junk-allowed t))) (:float `(ignore-errors (read-from-string ,form nil nil))) (t `(let ((f ,form)) (if (not (string= "" f)) f))))) (defun fornmeat (slot) (if (null (third slot)) "~a" (case (second slot) (:integer (format nil "~~~a,,,'0@a" (third slot))) (:float (format nil "~~~a,4,,,'0f" (+ 5 (third slot)))) (t "~a")))) (defun generate-slot-setters (str index &optional slot setters (offset 0)) (if (null slot) (if (null str) setters (generate-slot-setters (cdr str) index (car str) setters offset)) (generate-slot-setters (cdr str) index (car str) (cons `((slot-value message ',(first slot)) ,(unmearshall (second slot) (if (and (third slot) (not (eq :float (second slot)))) `(subseq (nth ,index lst) ,offset ,(+ offset (third slot))) `(subseq (nth ,index lst) ,offset)))) setters) (if (third slot) (+ offset (third slot)) offset)))) (defun generate-format-string (str &optional slot fmts) (if (null slot) (if (null str) (reverse fmts) (generate-format-string (cdr str) (car str) fmts)) (generate-format-string (cdr str) (car str) (cons (fornmeat slot) fmts))))