mirror of https://bitbucket.org/ausocean/av.git
implimenting LED netreciever colour control file
This commit is contained in:
parent
3db7d1b1f3
commit
0f35b619d7
|
@ -67,10 +67,12 @@ import (
|
|||
"bitbucket.org/ausocean/av/container/mts/meta"
|
||||
"bitbucket.org/ausocean/av/revid"
|
||||
"bitbucket.org/ausocean/av/revid/config"
|
||||
"bitbucket.org/ausocean/av/led"
|
||||
"bitbucket.org/ausocean/iot/pi/netlogger"
|
||||
"bitbucket.org/ausocean/iot/pi/netsender"
|
||||
"bitbucket.org/ausocean/iot/pi/sds"
|
||||
"bitbucket.org/ausocean/utils/logger"
|
||||
|
||||
)
|
||||
|
||||
// Copyright information prefixed to all metadata.
|
||||
|
@ -178,6 +180,10 @@ func main() {
|
|||
// run starts the main loop. This will run netsender on every pass of the loop
|
||||
// (sleeping inbetween), check vars, and if changed, update revid as appropriate.
|
||||
func run(rv *revid.Revid, ns *netsender.Sender, l *logger.Logger, nl *netlogger.Logger) {
|
||||
led_, err := led.NewLED(*l)
|
||||
if err != nil {
|
||||
l.Log(logger.Error, pkg+"could not create LED", "error", err.Error())
|
||||
}
|
||||
var vs int
|
||||
for {
|
||||
l.Log(logger.Debug, "running netsender")
|
||||
|
@ -212,6 +218,10 @@ func run(rv *revid.Revid, ns *netsender.Sender, l *logger.Logger, nl *netlogger.
|
|||
}
|
||||
l.Log(logger.Debug, "got new vars", "vars", vars)
|
||||
|
||||
err = led_.Update(vars["ledcolours"])
|
||||
if err != nil {
|
||||
l.Log(logger.Error, pkg+"could not update led", "error", err.Error())
|
||||
}
|
||||
// Configure revid based on the vars.
|
||||
l.Log(logger.Debug, "updating revid's configuration")
|
||||
err = rv.Update(vars)
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
DESCRIPTION
|
||||
LED.go provides an implementation of the LED interface for a basic
|
||||
multicolour LED using a background python process responsible for the
|
||||
hardware interfacing.
|
||||
|
||||
AUTHORS
|
||||
Alex Mastersson <alexm@ausoean.org>
|
||||
Saxon Nelson-Milton <saxon@ausocean.org>
|
||||
|
||||
LICENSE
|
||||
Copyright (C) 2020 the Australian Ocean Lab (AusOcean)
|
||||
|
||||
It is free software: you can redistribute it and/or modify them
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation, either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
It is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
||||
*/
|
||||
package led
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os/exec"
|
||||
"time"
|
||||
|
||||
"bitbucket.org/ausocean/utils/logger"
|
||||
)
|
||||
|
||||
// Background process constants.
|
||||
const processStartWait = 5 * time.Second
|
||||
|
||||
// LED is an implementation of the LED interface for a standard Multicolour LED.
|
||||
type LED struct {
|
||||
cmd *exec.Cmd
|
||||
stdin io.Writer
|
||||
stdout io.Reader
|
||||
r,g,b int
|
||||
log logger.Logger
|
||||
}
|
||||
|
||||
const pin = 5
|
||||
|
||||
// NewLED returns a new LED.
|
||||
func NewLED(l logger.Logger) (*LED, error) {
|
||||
s := &LED{log: l}
|
||||
s.cmd = exec.Command("python3", "-c", LEDScript)
|
||||
|
||||
var err error
|
||||
s.stdin, err = s.cmd.StdinPipe()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not pipe stdin of process: %w", err)
|
||||
}
|
||||
|
||||
s.stdout, err = s.cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not pipe stdout of process: %w", err)
|
||||
}
|
||||
|
||||
s.log.Debug("starting LEDCommand process")
|
||||
err = s.cmd.Start()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not start servCommand process: %w", err)
|
||||
}
|
||||
|
||||
time.Sleep(processStartWait)
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (s *LED) Update(v string) error {
|
||||
_, err := s.stdin.Write([]byte(v + "\r\n"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not write rgb to LEDCommand process: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
// Shutdown kills the LED command background process.
|
||||
func (s *LED) Shutdown() error {
|
||||
s.log.Debug("shutting down")
|
||||
err := s.cmd.Process.Kill()
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not kill LEDCommand process: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
func main(){
|
||||
var l logger.Logger
|
||||
_, err := NewLED(l)
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
|
||||
const LEDScript = `
|
||||
import sys
|
||||
import time
|
||||
import RPi.GPIO as GPIO
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
GPIO.setwarnings(False)
|
||||
|
||||
GPIO.setup(17, GPIO.OUT)
|
||||
GPIO.setup(18, GPIO.OUT)
|
||||
GPIO.setup(27, GPIO.OUT)
|
||||
|
||||
red = GPIO.PWM(17,120)
|
||||
green = GPIO.PWM(18,120)
|
||||
blue = GPIO.PWM(27,120)
|
||||
|
||||
redbr=50
|
||||
greenbr=50
|
||||
bluebr=50
|
||||
|
||||
red.start(0)
|
||||
green.start(0)
|
||||
blue.start(0)
|
||||
|
||||
def main():
|
||||
rgb = [0,0,0]
|
||||
|
||||
while True: # one loop per line
|
||||
|
||||
rgb[2] = 0
|
||||
next = sys.stdin.readline()
|
||||
if next == "":
|
||||
time.sleep(3)
|
||||
else:
|
||||
string = next.split(",")
|
||||
rgb[0] = int(string[0])
|
||||
rgb[1] = int(string[1])
|
||||
rgb[2] = int(string[2].strip("\n"))
|
||||
|
||||
print(rgb)
|
||||
rgblight(rgb[0],rgb[1],rgb[2])
|
||||
time.sleep(3)
|
||||
print("loop break")
|
||||
|
||||
def rgblight(rpwm,gpwm,bpwm):
|
||||
red.ChangeDutyCycle(rpwm)
|
||||
green.ChangeDutyCycle(gpwm)
|
||||
blue.ChangeDutyCycle(bpwm)
|
||||
|
||||
main()
|
||||
|
||||
`
|
Loading…
Reference in New Issue