#!/local/gauche/bin/gosh (use gauche.net) (use gauche.uvector) (use file.util) (use srfi-19) ; ; Some constants to peruse. ; (define-constant packetlen 14) (define-constant max-lines 174762) (define-constant log-filename "/space/temperature/web/gizmodata.txt") (define-constant outside-filename "/space/temperature/web/outsidetemp.txt") ; ; Some globals unfortunately. ; (define outside-temperature 0) (define log-port #f) (define current-line 0) ; ; Put a packet in the log file. ; (define (packet-output vec) (if (> current-line max-lines) (reopen-log)) (inc! current-line) (get-outside-temperature) (let ((date (current-date))) (format log-port "~d.~d ~d.~d ~d.~d ~4d~2,'0d~2,'0d~2,'0d~2,'0d~2,'0d~%" (u8vector-ref vec 1) (u8vector-ref vec 2) (u8vector-ref vec 3) (u8vector-ref vec 4) (u8vector-ref vec 5) (u8vector-ref vec 6) (date-year date) (date-month date) (date-day date) (date-hour date) (date-minute date) (date-second date)))) ; ; Close and rename logfile. Then reopen the logfile. ; (define (reopen-log) (set! current-line 0) (close-output-port log-port) (let ((sp (open-output-string)) (date (current-date))) (format sp "~a-~4d~2,'0d~2,'0d~2,'0d~2,'0d~2,'0d" log-filename (date-year date) (date-month date) (date-day date) (date-hour date) (date-minute date) (date-second date)) (sys-rename log-filename (get-output-string sp)) (close-output-port sp)) (set! log-port (open-output-file log-filename :buffering :line))) ; ; Retrieves ; (define (get-outside-temperature) (with-error-handler (lambda (eo) (let () outside-temperature)) (lambda () (with-input-from-file outside-filename (lambda () (rxmatch-let (rxmatch #/^([0-9]+\.[0-9]+|[0-9]+)$/ (read-line)) (#f t) (set! outside-temperature t) t)))))) ; ; This recurses to read the socket over and over ... ; (define (sock-process vec port) (read-block! vec port) (packet-output vec) (sock-process vec port)) ; ; Initialize some stuff. Invoke the socket processor. ; (define (main args) (get-outside-temperature) (set! log-port (open-output-file log-filename :buffering :line)) (let ((sock (make-socket PF_INET SOCK_DGRAM))) (socket-bind sock (make :port 1950)) (let ((inp (socket-input-port sock)) (vec (make-u8vector packetlen))) ((setter port-buffering) inp :full) (sock-process vec inp))))