diff service/laundry/laundry.go @ 901:c06fdb61157f

more laundry web support Ignore-this: c7313465fbd93fa902b909f9128c2ad darcs-hash:20130831173350-312f9-49b5bd4b435f9fa9523a637ce1555ef511de9b33
author drewp <drewp@bigasterisk.com>
date Sat, 31 Aug 2013 10:33:50 -0700
parents 2d718e542198
children d620e60bd397
line wrap: on
line diff
--- a/service/laundry/laundry.go	Mon Aug 26 22:11:29 2013 -0700
+++ b/service/laundry/laundry.go	Sat Aug 31 10:33:50 2013 -0700
@@ -5,6 +5,7 @@
 	"log"
 	"net/http"
 	"strconv"
+	"time"
 	"encoding/json"
 	"github.com/bmizerany/pat"
 	"github.com/mrmorphic/hwio"
@@ -74,18 +75,35 @@
 	if err := hwio.PinMode(pins.InSwitch2,		hwio.INPUT_PULLUP); err != nil { panic(err) }
 	if err := hwio.PinMode(pins.InSwitch3,		hwio.INPUT_PULLUP); err != nil { panic(err) }
 	if err := hwio.PinMode(pins.InDoorClosed,	hwio.INPUT_PULLUP); err != nil { panic(err) }
-	if err := hwio.PinMode(pins.OutLed,			hwio.OUTPUT); err != nil { panic(err) }
+	if err := hwio.PinMode(pins.OutLed,		hwio.OUTPUT); err != nil { panic(err) }
 	if err := hwio.PinMode(pins.OutSpeaker,		hwio.OUTPUT); err != nil { panic(err) }
 	if err := hwio.PinMode(pins.OutStrike,		hwio.OUTPUT); err != nil { panic(err) }
 	return pins
 }
 	
+
+func booleanBody(w http.ResponseWriter, r *http.Request) (level int, err error) {
+	body, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		panic(err)
+	}
+	level, err2 := strconv.Atoi(string(body[:]))
+	if err2 != nil {
+		http.Error(w, "body must be '0' or '1'", http.StatusBadRequest)
+		return 0, err
+	}
+	return level, nil
+}
+
 func main() {
 	pins := SetupIo()
 
 	m := pat.New()
 	
 	m.Get("/", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
+		// this one needs to fail if the hardware is broken in
+		// any way that we can determine, though I'm not sure
+		// what that will mean on rpi
 		http.ServeFile(w, r, "index.html")
 	}));
 
@@ -100,29 +118,74 @@
 			"switch3": DigitalRead(pins.InSwitch3),
 			"doorClosed": DigitalRead(pins.InDoorClosed),
 			"led": pins.LastOutLed,
+			"strike": pins.LastOutStrike,
 		})
 	}));
-
+	
 	m.Put("/led", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
 			panic(err)
 		}
-		level, err := strconv.Atoi(string(body[:]))
-		if err != nil {
-			http.Error(w, "body must be '0' or '1'", http.StatusBadRequest)
-			return
+		var level int
+		if string(body) == "on" {
+			level = 1
+		} else if string(body) == "off" {
+			level = 0
+		} else {
+			http.Error(w, "body must be 'on' or 'off'", http.StatusBadRequest)
+			return 
 		}
 
 		hwio.DigitalWrite(pins.OutLed, level)
 		pins.LastOutLed = level
-
 		http.Error(w, "", http.StatusAccepted)
-	}));
+	}))
 
+	setStrike := func (level int) {
+		hwio.DigitalWrite(pins.OutStrike, level)
+		pins.LastOutStrike = level
+	}
+	
+	m.Put("/strike", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
+		level, err := booleanBody(w, r)
+		if err != nil {
+			panic(err)
+		}
+		setStrike(level)
+		http.Error(w, "", http.StatusAccepted)
+	}))
+	
+	m.Put("/strike/temporaryUnlock", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
+		err := r.ParseForm()
+		if err != nil {
+			panic(err)
+		}
+		seconds, err2 := strconv.ParseFloat(string(r.Form["seconds"][0]), 32)
+		if err2 != nil {
+			http.Error(w, "seconds must be a float", http.StatusBadRequest)
+			return
+		}
+
+		// This is not correctly reentrant. There should be a
+		// stack of temporary effects that unpop correctly,
+		// and status should show you any running effects.
+		setStrike(1)
+		go func() {
+			time.Sleep(time.Duration(seconds * float64(time.Second)))
+			setStrike(0)
+		}()
+		http.Error(w, "", http.StatusAccepted)
+	}))
+
+	m.Put("/speaker/beep", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
+		// queue a beep
+		http.Error(w, "", http.StatusAccepted)
+	}))
+	
 	http.Handle("/", m)
-	log.Printf("Listening on port 8080")
-	err := http.ListenAndServe(":8080", nil)
+	log.Printf("Listening on port 8081")
+	err := http.ListenAndServe(":8081", nil)
 	if err != nil {
 		log.Fatal("ListenAndServe: ", err)
 	}