From 9b9a94a83bdc32b9a659467a0eb5417714b9652d Mon Sep 17 00:00:00 2001 From: paspo Date: Tue, 27 Aug 2019 08:42:32 +0200 Subject: [PATCH] toggle ok --- source/i2c.go | 33 ++++++++- source/webui.go | 154 ++++++++++++++++++++++++------------------ templates/status.html | 21 ++++-- 3 files changed, 136 insertions(+), 72 deletions(-) diff --git a/source/i2c.go b/source/i2c.go index f840eac..db93da2 100644 --- a/source/i2c.go +++ b/source/i2c.go @@ -31,19 +31,47 @@ func (b I2CBoard) channelStatus(ch uint) (bool, error) { return false, errors.New("Invalid channel") } write := []byte{0x0A} - b.data = make([]byte, 2) err := b.i2cdev.Tx(write, b.data) if err != nil { return false, err } byteToConsider := ch / b.channels - value := (b.data[byteToConsider] >> ch & 1) == 1 + value := (b.data[byteToConsider] >> (ch % 8) & 1) == 1 if b.inverted { value = !value } return value, nil } +func (b I2CBoard) channelToggle(ch uint) error { + var mask byte + + if b.channels <= 0 { + return errors.New("Board without channels") + } + if ch >= b.channels { + return errors.New("Invalid channel") + } + + // if b.data == nil { + _, _ = b.channelStatus(ch) + // } + + byteToConsider := ch / b.channels + mask = 1 << (ch % 8) + v := b.data[byteToConsider] + v ^= mask + b.data[byteToConsider] = v + + write := append([]byte{0x09}, b.data...) + _, err := b.i2cdev.Write(write) + if err != nil { + return err + } + + return nil +} + func initI2C() { // Make sure periph is initialized. if _, err := host.Init(); err != nil { @@ -71,6 +99,7 @@ func initI2C() { } MyBoard.i2cdev = *mydevice + MyBoard.data = make([]byte, (MyBoard.channels-1)/8+1) go func() { var i uint diff --git a/source/webui.go b/source/webui.go index 725ada2..403bd1e 100644 --- a/source/webui.go +++ b/source/webui.go @@ -4,83 +4,105 @@ import ( "fmt" "log" "net/http" + "strconv" "github.com/go-macaron/pongo2" "gopkg.in/macaron.v1" ) +func statusPage(ctx *macaron.Context) { + ctx.Data["pluglist"] = []Dictionary{ + {"id": 1, "description": "p1"}, + {"id": 2, "description": "p2"}, + {"id": 3, "description": "p3"}, + {"id": 4, "description": "p4"}, + {"id": 5, "description": "p5"}, + {"id": 6, "description": "p6"}, + {"id": 7, "description": "p7"}, + {"id": 8, "description": "p8"}, + } + ctx.HTML(200, "status") // 200 is the response code. +} + +func jsonStatus(ctx *macaron.Context) { + + p0, err := MyBoard.channelStatus(0) + if err != nil { + log.Fatal(err) + } + + p1, err := MyBoard.channelStatus(1) + if err != nil { + log.Fatal(err) + } + + p2, err := MyBoard.channelStatus(2) + if err != nil { + log.Fatal(err) + } + + p3, err := MyBoard.channelStatus(3) + if err != nil { + log.Fatal(err) + } + + p4, err := MyBoard.channelStatus(4) + if err != nil { + log.Fatal(err) + } + + p5, err := MyBoard.channelStatus(5) + if err != nil { + log.Fatal(err) + } + + p6, err := MyBoard.channelStatus(6) + if err != nil { + log.Fatal(err) + } + + p7, err := MyBoard.channelStatus(7) + if err != nil { + log.Fatal(err) + } + + ctx.JSON(http.StatusOK, Dictionary{ + "data": [][]string{ + {"0", "p0", fmt.Sprint(p0)}, + {"1", "p1", fmt.Sprint(p1)}, + {"2", "p2", fmt.Sprint(p2)}, + {"3", "p3", fmt.Sprint(p3)}, + {"4", "p4", fmt.Sprint(p4)}, + {"5", "p5", fmt.Sprint(p5)}, + {"6", "p6", fmt.Sprint(p6)}, + {"7", "p7", fmt.Sprint(p7)}, + }, + }) +} + +func jsonOutletToggle(ctx *macaron.Context) { + id, err := strconv.ParseUint(ctx.Params(":id"), 10, 64) + if err != nil { + log.Fatal(err) + } + err = MyBoard.channelToggle(uint(id)) + if err != nil { + log.Fatal(err) + } + ctx.JSON(http.StatusOK, Dictionary{ + "data": "ok", + }) +} + func startServer() { m := macaron.Classic() m.Use(pongo2.Pongoer()) m.Use(macaron.Static("static")) // m.Get("/", myHandler) - m.Get("/", func(ctx *macaron.Context) { - ctx.Data["pluglist"] = []Dictionary{ - {"id": 1, "description": "p1"}, - {"id": 2, "description": "p2"}, - {"id": 3, "description": "p3"}, - {"id": 4, "description": "p4"}, - {"id": 5, "description": "p5"}, - {"id": 6, "description": "p6"}, - {"id": 7, "description": "p7"}, - {"id": 8, "description": "p8"}, - } - ctx.HTML(200, "status") // 200 is the response code. - }) - - m.Get("/json/status", func(ctx *macaron.Context) { - - p0, err := MyBoard.channelStatus(0) - if err != nil { - log.Fatal(err) - } - - p1, err := MyBoard.channelStatus(1) - if err != nil { - log.Fatal(err) - } - - p2, err := MyBoard.channelStatus(2) - if err != nil { - log.Fatal(err) - } - - p3, err := MyBoard.channelStatus(3) - if err != nil { - log.Fatal(err) - } - - p4, err := MyBoard.channelStatus(4) - if err != nil { - log.Fatal(err) - } - - p5, err := MyBoard.channelStatus(5) - if err != nil { - log.Fatal(err) - } - - p6, err := MyBoard.channelStatus(6) - if err != nil { - log.Fatal(err) - } - - p7, err := MyBoard.channelStatus(7) - if err != nil { - log.Fatal(err) - } - - p1 = p1 && p2 && p3 && p4 && p5 && p6 && p7 - - ctx.JSON(http.StatusOK, Dictionary{ - "data": [][]string{ - {"0", "p0", fmt.Sprint(p0)}, - {"1", "p1", fmt.Sprint(p1)}, - {"2", "p2", fmt.Sprint(p2)}, - }, - }) - }) + m.Get("/", statusPage) + m.Get("/json/status", jsonStatus) + m.Post("/json/outlet/:id/toggle", jsonOutletToggle) m.Get("/boards", func(ctx *macaron.Context) { ctx.HTML(200, "boards") // 200 is the response code. diff --git a/templates/status.html b/templates/status.html index e847978..f48e12f 100644 --- a/templates/status.html +++ b/templates/status.html @@ -85,7 +85,7 @@ `; - $('#example2').DataTable({ + var table = $('#example2').DataTable({ 'ajax': '/json/status', "columns" : [ { "data" : 0 }, @@ -103,10 +103,23 @@ // fa-toggle-off - $('#example2 tbody').on( 'click', '[script="toggle"]', function () { - alert( 'ciao' ); + $('#example2 tbody').on( 'click', '[script="toggle"]', function (e) { + e.preventDefault(); + var id = $( this ).closest('tr').find('td:first').text(); + $.ajax({ + url: '/json/outlet/'+id+'/toggle', + type: 'post' + }) + .done(function(result) { + console.log(result); + table.ajax.reload(); + }) + .fail(function(jqXHR, textStatus, errorThrown) { + // needs to implement if it fails + console.log(textStatus); + }); - }); + }); } );