#!/local/gauche/bin/gosh (use gauche.net) ; network stuff (use srfi-19) ; time/date stuff (define-constant packetlen 14) (define-constant max-lines 174762) ;(define-constant log-filename "/space/temperature/web/gizmodata.txt") (define-constant log-filename "gizmodata.txt") (define log-port #f) (define current-line 0) (define (get-temperature) (let ((sock (make-client-socket 'inet "tiny.physics.unlv.edu" 80)) (room #f) (vent #f) (acunit #f)) (display "GET / HTTP/1.0\r\n" (socket-output-port sock)) (with-input-from-port (socket-input-port sock) (lambda () (port-for-each (lambda (line) (rxmatch-if (rxmatch #/([^T]+)Temperature =\s+(\d+\.\d+)\s/ line) (#f type temp) (cond ((string=? "Room " type) (set! room temp)) ((string=? "Room Vent " type) (set! vent temp)) ((string=? "AC Unit Vent " type) (set! acunit temp))) #f)) read-line))) (socket-close sock) (if (or (boolean? room) (boolean? vent) (boolean? acunit)) (error "Web page parse error") (list room vent acunit)))) ; ; Put the temperature in the log file. ; (define (temperature-output room vent acunit) (if (> current-line max-lines) (reopen-log)) (inc! current-line) (let ((date (current-date))) (format log-port "~d ~d ~d ~4d~2,'0d~2,'0d~2,'0d~2,'0d~2,'0d~%" room vent acunit (date-year date) (date-month date) (date-day date) (date-hour date) (date-minute date) (date-second date)))) ; ; Rename logfile ; (define (rename-log) (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))) ; ; Close and rename logfile. Then reopen the logfile. ; (define (reopen-log) (set! current-line 0) (close-output-port log-port) (rename-log) (set! log-port (open-output-file log-filename :buffering :line))) ; ; Program entry point. ; (define (main args) (with-error-handler (lambda (eo) #f) (lambda () (rename-log))) ; Do this just in case a log file already exists. (set! log-port (open-output-file log-filename :buffering :line)) (let loop () (with-error-handler (lambda (eo) (print eo)) (lambda () (let ((temps (get-temperature))) (temperature-output (car temps) (cadr temps) (caddr temps))))) (sys-sleep 30) (loop)))