Mercurial > code > home > repos > homeauto
diff service/laundry/laundry.go @ 899:2d718e542198
laundry add .go files
Ignore-this: 34b9f9b1ab2830da75757ffedb93ead7
darcs-hash:20130825055434-312f9-317d7333fabed38a3d3f0b5b18009ee486813081
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sat, 24 Aug 2013 22:54:34 -0700 |
parents | |
children | 27a685ce2e5d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/laundry/laundry.go Sat Aug 24 22:54:34 2013 -0700 @@ -0,0 +1,129 @@ +package main + +import ( + "io/ioutil" + "log" + "net/http" + "strconv" + "encoding/json" + "github.com/bmizerany/pat" + "github.com/mrmorphic/hwio" +) + +/* +hwio.DebugPinMap() wrote this: + +Pin 1: 3.3V, cap: +Pin 2: 5V, cap: +Pin 3: SDA,GPIO0 cap:output,input,input_pullup,input_pulldown +Pin 5: SCL,GPIO1 cap:output,input,input_pullup,input_pulldown +Pin 6: GROUND, cap: +Pin 7: GPIO4 cap:output,input,input_pullup,input_pulldown +Pin 8: TXD,GPIO14 cap:output,input,input_pullup,input_pulldown +Pin 10: RXD,GPIO15 cap:output,input,input_pullup,input_pulldown +Pin 11: GPIO17 cap:output,input,input_pullup,input_pulldown +Pin 12: GPIO18 cap:output,input,input_pullup,input_pulldown +Pin 13: GPIO21 cap:output,input,input_pullup,input_pulldown +Pin 15: GPIO22 cap:output,input,input_pullup,input_pulldown +Pin 16: GPIO23 cap:output,input,input_pullup,input_pulldown +Pin 18: GPIO24 cap:output,input,input_pullup,input_pulldown +Pin 19: MOSI,GPIO10 cap:output,input,input_pullup,input_pulldown +Pin 21: MISO,GPIO9 cap:output,input,input_pullup,input_pulldown +Pin 22: GPIO25 cap:output,input,input_pullup,input_pulldown +Pin 23: SCLK,GPIO11 cap:output,input,input_pullup,input_pulldown +Pin 24: CE0N,GPIO8 cap:output,input,input_pullup,input_pulldown +Pin 26: CE1N,GPIO7 cap:output,input,input_pullup,input_pulldown +*/ + +type Pins struct { + InMotion, InSwitch3, InSwitch1, InSwitch2, OutLed, OutSpeaker, InDoorClosed, OutStrike hwio.Pin + LastOutLed, LastOutStrike int +} + +// hwio.GetPin with a panic instead of an error return +func GetPin(id string) hwio.Pin { + p, e := hwio.GetPin(id) + if e != nil { + panic(e) + } + return p +} + +func DigitalRead(p hwio.Pin) int { + v, err := hwio.DigitalRead(p) + if err != nil { + panic(err) + } + return v +} + +func SetupIo() Pins { + pins := Pins{ + InMotion: GetPin("GPIO0"), + InSwitch3: GetPin("GPIO1"), + InSwitch1: GetPin("GPIO4"), + InSwitch2: GetPin("GPIO17"), + OutLed: GetPin("GPIO21"), + OutSpeaker: GetPin("GPIO22"), + InDoorClosed: GetPin("GPIO10"), + OutStrike: GetPin("GPIO9"), + } + + if err := hwio.PinMode(pins.InMotion, hwio.INPUT_PULLUP); err != nil { panic(err) } + if err := hwio.PinMode(pins.InSwitch1, hwio.INPUT_PULLUP); err != nil { panic(err) } + 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.OutSpeaker, hwio.OUTPUT); err != nil { panic(err) } + if err := hwio.PinMode(pins.OutStrike, hwio.OUTPUT); err != nil { panic(err) } + return pins +} + +func main() { + pins := SetupIo() + + m := pat.New() + + m.Get("/", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, "index.html") + })); + + m.Get("/static/:any", http.FileServer(http.Dir("./"))); + + m.Get("/status", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { + jsonEncode := json.NewEncoder(w) + jsonEncode.Encode(map[string]int{ + "motion": DigitalRead(pins.InMotion), + "switch1": DigitalRead(pins.InSwitch1), + "switch2": DigitalRead(pins.InSwitch2), + "switch3": DigitalRead(pins.InSwitch3), + "doorClosed": DigitalRead(pins.InDoorClosed), + "led": pins.LastOutLed, + }) + })); + + 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 + } + + hwio.DigitalWrite(pins.OutLed, level) + pins.LastOutLed = level + + http.Error(w, "", http.StatusAccepted) + })); + + http.Handle("/", m) + log.Printf("Listening on port 8080") + err := http.ListenAndServe(":8080", nil) + if err != nil { + log.Fatal("ListenAndServe: ", err) + } +}