From 92d99bc32cb3a26557e821a091578ffdc2374466 Mon Sep 17 00:00:00 2001 From: vinymeuh Date: Sat, 27 Apr 2019 19:46:59 +0200 Subject: [PATCH] initial commit --- .gitignore | 5 + .travis.yml | 4 + LICENSE | 21 ++ Makefile | 41 +++ README.md | 47 ++++ drivers/winstar/display.go | 122 +++++++++ drivers/winstar/drivertest/.gitignore | 1 + drivers/winstar/drivertest/README.md | 7 + drivers/winstar/drivertest/main.go | 33 +++ drivers/winstar/weh001602a.go | 139 +++++++++++ go.mod | 6 + go.sum | 9 + main.go | 74 ++++++ mpd/client.go | 346 ++++++++++++++++++++++++++ mpd/client_test.go | 253 +++++++++++++++++++ player/displayer.go | 57 +++++ player/mpdfetcher.go | 51 ++++ player/powerbutton.go | 62 +++++ player/starter.go | 55 ++++ public/I-SABRE-V3_FR_1_1.jpg | Bin 0 -> 97435 bytes radiogagad.service | 10 + 21 files changed, 1343 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 drivers/winstar/display.go create mode 100644 drivers/winstar/drivertest/.gitignore create mode 100644 drivers/winstar/drivertest/README.md create mode 100644 drivers/winstar/drivertest/main.go create mode 100644 drivers/winstar/weh001602a.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 mpd/client.go create mode 100644 mpd/client_test.go create mode 100644 player/displayer.go create mode 100644 player/mpdfetcher.go create mode 100644 player/powerbutton.go create mode 100644 player/starter.go create mode 100644 public/I-SABRE-V3_FR_1_1.jpg create mode 100644 radiogagad.service diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82c6178 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +.vscode + +coverage.out +radiogagad diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b2d47d0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: go + +go: +- 1.12.x diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4ad5789 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 VinyMeuh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ae79d4c --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +BINARY=radiogagad + +SHELL := $(shell which bash) +ENV = /usr/bin/env + +.SHELLFLAGS = -c + +.ONESHELL: ; +.NOTPARALLEL: ; +.EXPORT_ALL_VARIABLES: + +.PHONY: all +.DEFAULT_GOAL := help + +VERSION = `git describe --tags --always` +BUILD = `date +%FT%T%z` + +LDFLAGS = -ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD}" + + +build: ## Build for current host + go build ${LDFLAGS} -o ${BINARY} + +buildarm6: ## Build for Pi Zero + GOOS=linux GOARCH=arm GOARM=6 go build ${LDFLAGS} -o ${BINARY} + +buildarm7: ## Build for Pi 3 + GOOS=linux GOARCH=arm GOARM=7 go build ${LDFLAGS} -o ${BINARY} + +clean: ## Delete binary + rm -f ${BINARY} + +coverage: ## Show test coverage + go tool cover -func=coverage.out + go tool cover -html=coverage.out + +help: ## Show Help + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' + +test: ## Run tests + go test -coverprofile=coverage.out ./... diff --git a/README.md b/README.md new file mode 100644 index 0000000..efd5df0 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# radiogagad - the daemon inside my RaspDAC + +[![Build Status](https://travis-ci.org/vinymeuh/radiogagad.svg?branch=master)](https://travis-ci.org/vinymeuh/radiogagad) +[![Go Report Card](https://goreportcard.com/badge/github.com/vinymeuh/radiogagad)](https://goreportcard.com/report/github.com/vinymeuh/radiogagad) + +## Build and install + +First you need a [Go](https://golang.org/dl/) distribution. Then on the build host, targeting a Raspberry Pi 3 + +``` +make buildarm7 +``` + +Install by simply copy the binary under ```/usr/local/bin``` and setup the service for the service manager used by the distribution + +* For systemd: [radiogagad.service](https://github.com/vinymeuh/radiogagad/blob/master/radiogagad.service) + +## Configuration + +Some points are configurables using environment variables + +| Variable | Usage | Defaults | +| -------- | ----- | -------- | +| RGGD_MPD_SERVER | mpd server and port to connect to | localhost:6600 | +| RGGD_STARTUP_PLAYLISTS | comma separated list of playlists to be tried to load and play at start-up | | + +## Inspirations, links and references + +### RaspDAC pinout + +![RaspDAC pinout](https://github.com/vinymeuh/radiogagad/blob/master/public/I-SABRE-V3_FR_1_1.jpg) + +### Power Button + +* [Example implementations from Audiophonics](https://github.com/audiophonics/Raspberry-pwr-management) + +### MPD + +* [MPD Protocol Specification](https://www.musicpd.org/doc/html/protocol.html) + +### Winstar OLED WEH001602A + +* [HD44780U Hitachi Datasheet](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) +* [Winstar_GraphicOLED.py](https://github.com/dhrone/Raspdac-Display/blob/master/Winstar_GraphicOLED.py) +* Wikipedia article for [Hitachi HD44780 LCD controller](https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller) +* [Adafruit_CharacterOLED](https://github.com/ladyada/Adafruit_CharacterOLED) +* [Interfacing 16x2 LCD with Raspberry Pi using GPIO & Python](http://www.rpiblog.com/2012/11/interfacing-16x2-lcd-with-raspberry-pi.html) diff --git a/drivers/winstar/display.go b/drivers/winstar/display.go new file mode 100644 index 0000000..f60940d --- /dev/null +++ b/drivers/winstar/display.go @@ -0,0 +1,122 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +// This file contains the public API of the driver +// - the singleton Display (!!no thread safe!!) +// - high level commands to control display and write text +// +// Pinout is hard coded for the I-Sabre V3 DAC from Audiophonics + +package winstar + +import ( + "fmt" + "time" + + "periph.io/x/periph/conn/gpio" + "periph.io/x/periph/conn/gpio/gpioreg" + "periph.io/x/periph/host" +) + +const ( + _RS = "GPIO7" + _ES = "GPIO8" + _DB4 = "GPIO25" + _DB5 = "GPIO24" + _DB6 = "GPIO23" + _DB7 = "GPIO27" +) + +// LineNumber is used by WriteAt() to select the line where to write +type LineNumber int + +const ( + // Line1 to select first line of the display + Line1 LineNumber = iota + // Line2 to select second line of the display + Line2 +) + +var display *weh001602a + +// Display returns the initialized driver +func Display() *weh001602a { + if display == nil { + host.Init() + display = &weh001602a{ + rs: gpioreg.ByName(_RS), + es: gpioreg.ByName(_ES), + data: [4]gpio.PinIO{ + gpioreg.ByName(_DB4), + gpioreg.ByName(_DB5), + gpioreg.ByName(_DB6), + gpioreg.ByName(_DB7), + }, + } + display.initialize() + } + return display +} + +/*********************/ +/** Display Control **/ +/*********************/ + +// Clear display writes space code 20H into all DDRAM addresses. +// It then sets DDRAM address 0 into the address counter, +// and returns the display to its original status if it was shifted. +func (w *weh001602a) Clear() { + w.sendCommand(instrClearDisplay) + time.Sleep(10 * time.Millisecond) +} + +// DisplayOn turns the display on +func (w *weh001602a) DisplayOn() { + w.instrDisplayControl = w.instrDisplayControl | displayOn + fmt.Printf("%-16s %08b (%08b)\n", "DisplayOn", w.instrDisplayControl, displayOn) + w.sendCommand(w.instrDisplayControl) +} + +// DisplayOff turns the display off +func (w *weh001602a) DisplayOff() { + w.instrDisplayControl = w.instrDisplayControl & displayOff + fmt.Printf("%-16s %08b (%08b)\n", "DisplayOff", w.instrDisplayControl, displayOff) + w.sendCommand(w.instrDisplayControl) +} + +/********************/ +/** Cursor Control **/ +/********************/ + +// Return home sets DDRAM address 0 into the address counter, +// and returns the display to its original status if it was shifted. +// The DDRAM contents do not change. +func (w *weh001602a) Home() { + w.sendCommand(instrReturnHome) + //time.Sleep(10 * time.Millisecond) +} + +/**********************/ +/** Write Characters **/ +/**********************/ + +// Send string to LCD at current position of cursor +func (w *weh001602a) Write(msg string) { + for _, char := range msg { + if char > 255 { + char = 32 + } + w.sendData(uint8(char)) + } +} + +// Send string to LCD at start of one of the lines +func (w *weh001602a) WriteAt(line LineNumber, msg string) { + switch line { + case Line1: + w.sendCommand(addrStartLine1) + case Line2: + w.sendCommand(addrStartLine2) + } + w.Write(msg) +} diff --git a/drivers/winstar/drivertest/.gitignore b/drivers/winstar/drivertest/.gitignore new file mode 100644 index 0000000..640d299 --- /dev/null +++ b/drivers/winstar/drivertest/.gitignore @@ -0,0 +1 @@ +drivertest diff --git a/drivers/winstar/drivertest/README.md b/drivers/winstar/drivertest/README.md new file mode 100644 index 0000000..28a4ddd --- /dev/null +++ b/drivers/winstar/drivertest/README.md @@ -0,0 +1,7 @@ +# radiogagad - test program for the winstar oled driver + +Build + +```shell +GOOS=linux GOARCH=arm GOARM=7 go build +``` diff --git a/drivers/winstar/drivertest/main.go b/drivers/winstar/drivertest/main.go new file mode 100644 index 0000000..b667d28 --- /dev/null +++ b/drivers/winstar/drivertest/main.go @@ -0,0 +1,33 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +// Test program for the winstar oled driver +// Build with: GOOS=linux GOARCH=arm GOARM=7 go build + +package main + +import ( + "time" + + "github.com/vinymeuh/radiogagad/drivers/winstar" +) + +func main() { + lcd := winstar.Display() + + lcd.Write("All we hear is radio ga ga") + lcd.WriteAt(winstar.Line2, "Radio goo goo") + time.Sleep(3 * time.Second) + + lcd.DisplayOff() + time.Sleep(3 * time.Second) + + lcd.Home() + lcd.Clear() + lcd.WriteAt(winstar.Line1, "Don't stop me now") + lcd.WriteAt(winstar.Line2, "Have a good time, good time") + lcd.DisplayOn() + time.Sleep(3 * time.Second) + + lcd.DisplayOff() +} diff --git a/drivers/winstar/weh001602a.go b/drivers/winstar/weh001602a.go new file mode 100644 index 0000000..2854d65 --- /dev/null +++ b/drivers/winstar/weh001602a.go @@ -0,0 +1,139 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +// Driver for the Winstar 16x2 Character OLED WEH001602A restricted to the RaspDAC use case. +// It works in 4-bit read-only mode (RW pin connected to ground) +// +// In this restricted use case I can ignore most of the errors, must works or crash ! +// So the code should stay readable and easily comparable with Winstar specifications. +// +// This file contains the heart of the beast: +// - strucutre definition for the driver and constants +// - low level functions to send command or data to the hardware + +package winstar + +import ( + "time" + + "periph.io/x/periph/conn/gpio" +) + +const ( + // instructions (with all flags to zero) + instrClearDisplay = 0x01 + instrReturnHome = 0x02 + instrEntryModeSet = 0x04 + instrDisplayOnOffControl = 0x08 + instrCursorShift = 0x10 + instrFunctionSet = 0x20 + instrSetCGRAMaddress = 0x40 + instrSetDDRAMaddress = 0x80 + + // flags for EntryModeSet + right = 0x01 << 1 + left = 0xff & right + shift = 0x01 + noshift = 0x00 + + // flags for DisplayControl + displayOn = 0x01 << 2 + displayOff = 0xff ^ displayOn + cursorOn = 0x01 << 1 + cursorOff = 0xff ^ cursorOn + blinkOn = 0x01 + blinkOff = 0x00 + + // flags for FunctionSet + dataLength8bit = 0x01 << 4 + dataLength4bit = 0xff ^ dataLength8bit + display2lines = 0x01 << 3 + display1line = 0xff ^ display2lines + font5x10 = 0x01 << 2 + font5x8 = 0xff ^ font5x10 + fontWesternEuropean2 = 0x03 + fontEnglishRussian = 0x02 + fontWesternEuropean1 = 0x01 + fontEnglishJapanese = 0x00 + + // Character Mode Addressing - start address + addrStartLine1 = 0x80 + addrStartLine2 = 0xc0 +) + +type weh001602a struct { + rs gpio.PinIO // Register Select (High=DATA, Low=Instruction Code) + es gpio.PinIO // Chip Enable Signal + data [4]gpio.PinIO // Data bit 4-7 + instrDisplayControl uint8 // +} + +func (w *weh001602a) initialize() { + + w.rs.Out(gpio.Low) + w.es.Out(gpio.Low) + for i := 0; i < 4; i++ { + w.data[i].Out(gpio.Low) + } + w.instrDisplayControl = instrDisplayOnOffControl | displayOn // display on, no cursor + + // from HD44780U Hitachi Datasheet - page 46 + // Initializing by Instruction - 4-Bit interface + time.Sleep(20 * time.Millisecond) // wait for more than 15ms after VCC rises to 4.5 V + w.write4bits(0x03) // function set (interface is 8 bits long) + time.Sleep(5 * time.Millisecond) // wait for more than 4.1ms + w.write4bits(0x03) // function set (interface is 8 bits long) + time.Sleep(100 * time.Microsecond) // wait for more than 100μs + w.write4bits(0x03) // function set (interface is 8 bits long) + w.write4bits(0x02) // function set, set to 4-bit operation (interface is 8 bits long) + + w.sendCommand(instrFunctionSet | display2lines | fontWesternEuropean1) // specify the number of display lines and font size and table + w.sendCommand(instrDisplayOnOffControl) // display off + w.sendCommand(instrClearDisplay) // display clear + time.Sleep(10 * time.Millisecond) // clear display is a long instruction (max 6.2ms) + w.sendCommand(instrEntryModeSet | right) // cursor move to the right, noshift + + w.sendCommand(instrReturnHome) // set DDRAM address 0 in address counter (not done by display clear ?) + w.sendCommand(w.instrDisplayControl) // display on +} + +func (w *weh001602a) sendCommand(bits uint8) { + w.write8bits(bits, gpio.Low) +} + +func (w *weh001602a) sendData(bits uint8) { + w.write8bits(bits, gpio.High) +} + +// write8bits write 8 bits in 4-bit mode: +// - character and control data are transferred as pairs of 4-bit "nibbles" on the upper data pins, DB7-DB4. +// - the four most significant bits (7-4) must be written first, followed by the four least significant bits (3-0). +// rs controls the register selected +// - gpio.Low -> Instruction Register +// - gpio.Hihg -> Data Register +func (w *weh001602a) write8bits(bits uint8, rs gpio.Level) { + w.rs.Out(rs) + w.write4bits(bits >> 4) + w.write4bits(bits) +} + +// write4bits write 4 bits on the data pins DB7-DB4 +func (w *weh001602a) write4bits(bits uint8) { + for i := uint(0); i < 4; i++ { + switch (bits >> i) & 0x01 { + case 0x00: + w.data[i].Out(gpio.Low) + case 0x01: + w.data[i].Out(gpio.High) + } + } + w.enable() +} + +// Pulse an enable signal on ES pin +func (w *weh001602a) enable() { + w.es.Out(gpio.High) + time.Sleep(100 * time.Nanosecond) + w.es.Out(gpio.Low) + time.Sleep(100 * time.Nanosecond) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2fe1a9e --- /dev/null +++ b/go.mod @@ -0,0 +1,6 @@ +module github.com/vinymeuh/radiogagad + +require ( + github.com/stretchr/testify v1.3.0 + periph.io/x/periph v3.4.0+incompatible +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e31295c --- /dev/null +++ b/go.sum @@ -0,0 +1,9 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +periph.io/x/periph v3.4.0+incompatible h1:5gzxE4ryPq52cdqSw0mErR6pyJK8cBF2qdUAcOWh0bo= +periph.io/x/periph v3.4.0+incompatible/go.mod h1:EWr+FCIU2dBWz5/wSWeiIUJTriYv9v2j2ENBmgYyy7Y= diff --git a/main.go b/main.go new file mode 100644 index 0000000..60db34d --- /dev/null +++ b/main.go @@ -0,0 +1,74 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package main + +import ( + "log" + "os" + "os/signal" + "runtime" + "strings" + "sync" + "syscall" + + "github.com/vinymeuh/radiogagad/player" +) + +// variables for build time versioning +var ( + Version string + Build string +) + +func main() { + logmsg := log.New(os.Stdout, "", 0) + logmsg.Printf("Starting radiogagad %s built %s using %s (%s/%s)\n", Version, Build, runtime.Version(), runtime.GOOS, runtime.GOARCH) + + server := os.Getenv("RGGD_MPD_SERVER") + if server == "" { + server = "localhost:6600" + } + logmsg.Printf("Using MPD server address %s\n", server) + + // this channel will be used by goroutines to return messages to main + var logch = make(chan string, 32) // buffered channel can hold up to 32 messages before block + // this channel will be used to exchange data from MPDFetcher to Displayer + var mpdinfo = make(chan player.MPDInfo, 1) + // this channel is used by notify Displayer before shutting down + var stopscr = make(chan struct{}) + // this wait group is used for waiting that Displayer clear the screen before exit + var clrscr sync.WaitGroup + + // signal handler for SIGTERM & SIGINT + var stop = make(chan os.Signal) + signal.Notify(stop, syscall.SIGTERM) + signal.Notify(stop, syscall.SIGINT) + go func() { + _ = <-stop + // notify Displayer and wait it finished + stopscr <- struct{}{} + clrscr.Wait() + os.Exit(0) + }() + + // launches the goroutine responsible for the power button + go player.PowerButton(logch) + + // launches the goroutine responsible for starting playback of a playlist + playlists := strings.Split(os.Getenv("RGGD_STARTUP_PLAYLISTS"), ",") + if len(playlists) > 0 && playlists[0] != "" { + go player.Starter(server, playlists, logch) + } + + // launches the goroutines which manage the display + go player.MPDFetcher(server, mpdinfo, logch) + go player.Displayer(mpdinfo, stopscr, &clrscr, logch) + + // main loop waits for messages from goroutines + for { + msg := <-logch + logmsg.Println(msg) + } + +} diff --git a/mpd/client.go b/mpd/client.go new file mode 100644 index 0000000..4758bb8 --- /dev/null +++ b/mpd/client.go @@ -0,0 +1,346 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package mpd + +import ( + "io" + "net" + "net/textproto" + "strconv" + "strings" +) + +// Client implements the MPD protocol +type Client struct { + addr string + conn *textproto.Conn + version string // the version of the protocol spoken, not the real version of the daemon +} + +// Dial connects a client to the MPD server listening on tcp addr +func Dial(addr string) (*Client, error) { + conn, err := net.Dial("tcp", addr) + if err != nil { + return nil, err + } + return NewClient(addr, conn) +} + +// NewClient creates a new Client using conn for I/O. +func NewClient(addr string, conn io.ReadWriteCloser) (*Client, error) { + c := &Client{ + addr: addr, + conn: textproto.NewConn(conn), + } + line, err := c.conn.ReadLine() + if err != nil { + return nil, err + } + if line[0:6] != "OK MPD" { + return nil, textproto.ProtocolError(line) + } + c.version = strings.Split(line, " ")[2] + return c, nil +} + +// Request execute a MPD command +func (c *Client) Request(format string, args ...interface{}) ([]string, error) { + id, err := c.conn.Cmd(format, args...) + if err != nil { + return nil, err + } + c.conn.StartResponse(id) + defer c.conn.EndResponse(id) + + var response []string + for { + line, err := c.conn.ReadLine() + if err != nil { + return nil, err + } + if line == "OK" { + return response, nil + } + if line[0:3] == "ACK" { + return nil, textproto.ProtocolError(line) + } + response = append(response, line) + } +} + +/***************************/ +/** Querying MPD’s status **/ +/***************************/ + +// ClearError clears the current error message in status +func (c *Client) ClearError() error { + _, err := c.Request("clearerror") + return err +} + +// CurrentSong contains the song info returned by CurrentSong() +type CurrentSong struct { + Album string + Artist string + File string + ID int + Name string + Pos int + Time int + Title string +} + +// CurrentSong displays the song info of the current song +func (c *Client) CurrentSong() (*CurrentSong, error) { + resp, err := c.Request("currentsong") + if err != nil { + return nil, err + } + + var s CurrentSong + for _, line := range resp { + elm := strings.Split(line, ": ") + if len(elm) < 2 { + return nil, textproto.ProtocolError(line) + } + switch elm[0] { + case "Album": + s.Album = elm[1] + case "Artist": + s.Artist = elm[1] + case "file": + s.File = elm[1] + case "Id": + s.ID, _ = strconv.Atoi(elm[1]) + case "Name": + s.Name = elm[1] + case "Pos": + s.Pos, _ = strconv.Atoi(elm[1]) + case "Time": + s.Time, _ = strconv.Atoi(elm[1]) + case "Title": + s.Title = elm[1] + } + } + return &s, nil +} + +// Idle waits until there is a noteworthy change in one or more of MPD’s subsystems +// While a client is waiting for idle results, the server disables timeouts, +// allowing a client to wait for events as long as mpd runs. +// Change events accumulate, even while the connection is not in “idle” mode, no events gets +// lost while the client is doing something else with the connection. +// If an event had already occurred since the last call, the new idle command will return immediately. +func (c *Client) Idle(subsystems string) ([]string, error) { + resp, err := c.Request("idle %s", subsystems) + if err != nil { + return nil, err + } + + events := make([]string, 0, 6) + i := 0 + for _, line := range resp { + elm := strings.Split(line, ": ") + if len(elm) < 2 { + return nil, textproto.ProtocolError(line) + } + switch elm[0] { + case "changed": + events = append(events, elm[1]) + i++ + } + } + return events, nil +} + +// NoIdle cancels Idle Command (no other commands are allowed) +func (c *Client) NoIdle() error { + _, err := c.Request("noidle") + return err +} + +// Status contains current status of the player returned by Status() +// Note: some fields returned by MPD are ignored +type Status struct { + Audio string + Bitrate int + Duration int + Elapsed float64 + Error string + Playlist int + PlaylistLength int + Song int + Songid int + State string +} + +// Status reports the current status of the player and the volume level +func (c *Client) Status() (*Status, error) { + resp, err := c.Request("status") + if err != nil { + return nil, err + } + + var s Status + for _, line := range resp { + elm := strings.Split(line, ": ") + if len(elm) < 2 { + return nil, textproto.ProtocolError(line) + } + switch elm[0] { + case "audio": + s.Audio = elm[1] + case "bitrate": + s.Bitrate, _ = strconv.Atoi(elm[1]) + case "duration": + s.Duration, _ = strconv.Atoi(elm[1]) + case "elapsed": + s.Elapsed, _ = strconv.ParseFloat(elm[1], 64) + case "error": + s.Error = elm[1] + case "playlist": + s.Playlist, _ = strconv.Atoi(elm[1]) + case "playlistlength": + s.PlaylistLength, _ = strconv.Atoi(elm[1]) + case "song": + s.Song, _ = strconv.Atoi(elm[1]) + case "songid": + s.Songid, _ = strconv.Atoi(elm[1]) + case "state": + s.State = elm[1] + } + } + return &s, nil +} + +// Stats contains server statistics returned by Stats() +type Stats struct { + Artists int + Albums int + DBplaytime int + DBupdate int + Playtime int + Songs int + Uptime int +} + +// Stats displays server statistics +func (c *Client) Stats() (*Stats, error) { + resp, err := c.Request("stats") + if err != nil { + return nil, err + } + + var s Stats + for _, line := range resp { + elm := strings.Split(line, ": ") + if len(elm) < 2 { + return nil, textproto.ProtocolError(line) + } + switch elm[0] { + case "artists": + s.Artists, _ = strconv.Atoi(elm[1]) + case "albums": + s.Albums, _ = strconv.Atoi(elm[1]) + case "db_playtime": + s.DBplaytime, _ = strconv.Atoi(elm[1]) + case "db_update": + s.DBupdate, _ = strconv.Atoi(elm[1]) + case "playtime": + s.Playtime, _ = strconv.Atoi(elm[1]) + case "songs": + s.Songs, _ = strconv.Atoi(elm[1]) + case "uptime": + s.Uptime, _ = strconv.Atoi(elm[1]) + } + } + return &s, nil +} + +/**************************/ +/** Controlling playback **/ +/**************************/ + +// Next plays next song in the playlist +func (c *Client) Next() error { + _, err := c.Request("next") + return err +} + +// Pause toggles pause/resumes playing +func (c *Client) Pause(pause bool) error { + var err error + switch pause { + case true: + _, err = c.Request("pause 1") + case false: + _, err = c.Request("pause 0") + } + return err +} + +// Play begins playing the playlist at song number songpos. +// If songpos equal -1, starts playing at the current position +// in the playlist: this is not documented in the protocol but +// successfully tested with MPD 0.19.0 +func (c *Client) Play(songpos int) error { + _, err := c.Request("play %d", songpos) + return err +} + +// PlayID begins playing the playlist at song number songpos. +// If songpos equal -1, starts playing at the current position +// in the playlist: this is not documented in the protocol but +// successfully tested with MPD 0.19.0 +func (c *Client) PlayID(songid int) error { + _, err := c.Request("playid %d", songid) + return err +} + +// Previous plays previous song in the playlist +func (c *Client) Previous() error { + _, err := c.Request("previous") + return err +} + +// Stop stops playing +func (c *Client) Stop() error { + _, err := c.Request("stop") + return err +} + +/**********************/ +/** Stored playlists **/ +/**********************/ + +// Load loads the playlist into the current queue +// Note: range [start:end] currently not supported +func (c *Client) Load(name string) error { + _, err := c.Request("load %s", name) + return err +} + +/*************************/ +/** Connection settings **/ +/*************************/ + +// Close the connection with MPD +func (c *Client) Close() error { + if c.conn != nil { + // clients should not use "close" command; instead, they should just close the socket + err := c.conn.Close() + c.conn = nil + c.version = "" + if err != nil { + return err + } + } + return nil +} + +// Ping does nothing but return “OK” +func (c *Client) Ping() error { + _, err := c.Request("ping") + return err +} diff --git a/mpd/client_test.go b/mpd/client_test.go new file mode 100644 index 0000000..bc38a7c --- /dev/null +++ b/mpd/client_test.go @@ -0,0 +1,253 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package mpd + +import ( + "bytes" + "fmt" + "io" + "net" + "regexp" + "testing" + + "github.com/stretchr/testify/assert" +) + +func (s CurrentSong) String() string { + return fmt.Sprintf("file: %s\nId: %d\nName: %s\nPos: %d\nTime: %d\nTitle: %s\n", + s.File, s.ID, s.Name, s.Pos, s.Time, s.Title) +} + +var currentSongTestData = CurrentSong{ + File: "http://novazz.ice.infomaniak.ch/novazz-128.mp3", + ID: 1, + Name: "novazz", + Pos: 0, + Time: 0, + Title: "", +} + +func (s Status) String() string { + return fmt.Sprintf("audio: %s\nbitrate: %d\nduration: %d\nelapsed: %f\nerror: %s\nplaylist: %d\nstate: %s\nsong: %d\nsongid: %d\n", + s.Audio, s.Bitrate, s.Duration, s.Elapsed, s.Error, s.Playlist, s.State, s.Song, s.Songid) +} + +var statusTestData = Status{ + Playlist: 17, + State: "play", + Song: 0, + Songid: 2, + Elapsed: 2507.560, + Duration: 600, + Bitrate: 128, + Audio: "44100:16:2", + Error: "", +} + +func (s Stats) String() string { + return fmt.Sprintf("artists: %d\nalbums: %d\ndb_playtime: %d\ndb_update: %d\nplaytime: %d\nsongs: %d\nuptime: %d\n", + s.Artists, s.Albums, s.DBplaytime, s.DBupdate, s.Playtime, s.Songs, s.Uptime) +} + +var statsTestData = Stats{ + Artists: 100, + Albums: 110, + DBplaytime: 380000, + DBupdate: 1550336499, + Playtime: 400, + Songs: 1500, + Uptime: 500, +} + +func mockMPDServer(t *testing.T, server net.Conn) { + fmt.Fprintln(server, "OK MPD 0.19.0") + go mockMPDHandleConnection(t, server) +} + +func mockMPDHandleConnection(t *testing.T, conn net.Conn) { + var simpleCommands = regexp.MustCompile(`^(clearerror|ping|next|previous|stop)\r\n`) + var pauseCommand = regexp.MustCompile(`^pause\s+(0|1)\r\n`) + var playCommand = regexp.MustCompile(`^(play|playid)\s+(-1|\d+)\r\n`) + var loadCommand = regexp.MustCompile(`^load\s+(\w+)\r\n`) + var statusCommand = regexp.MustCompile(`^status\r\n`) + var statsCommand = regexp.MustCompile(`^stats\r\n`) + var currentSongCommand = regexp.MustCompile(`^currentsong\r\n`) + + buf := make([]byte, 4096) + for { + _, err := conn.Read(buf) + if err != nil { + if err != io.EOF { + fmt.Println("read error:", err) + } + break + } + + b := bytes.Trim(buf, "\x00") + //fmt.Println(string(b)) + + switch { + case currentSongCommand.Match(b): + fmt.Fprintf(conn, "%sOK\n", currentSongTestData) + case statusCommand.Match(b): + fmt.Fprintf(conn, "%sOK\n", statusTestData) + case statsCommand.Match(b): + fmt.Fprintf(conn, "%sOK\n", statsTestData) + case simpleCommands.Match(b), pauseCommand.Match(b), playCommand.Match(b): + fmt.Fprintln(conn, "OK") + case loadCommand.Match(b): + m := loadCommand.FindStringSubmatch(string(b)) + if m[1] == "nonexistent" { + fmt.Fprintln(conn, "ACK [50@0] {load} No such playlist") + } else { + fmt.Fprintln(conn, "OK") + } + default: + fmt.Fprintf(conn, "ACK {%s}", string(b)) + } + } + conn.Close() +} + +func TestFailingConnection(t *testing.T) { + _, err := Dial("localhost:1") + assert.Error(t, err) + _, err = Dial("host.notexists:6600") + assert.Error(t, err) +} + +func TestCurrentSongCommand(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + song, err := mpc.CurrentSong() + if assert.NoError(t, err) { + assert.Equal(t, currentSongTestData.File, song.File, "field CurrentSong.File") + assert.Equal(t, currentSongTestData.ID, song.ID, "field CurrentSong.ID") + assert.Equal(t, currentSongTestData.Name, song.Name, "field CurrentSong.Name") + assert.Equal(t, currentSongTestData.Pos, song.Pos, "field CurrentSong.Pos") + assert.Equal(t, currentSongTestData.Time, song.Time, "field CurrentSong.Time") + assert.Equal(t, currentSongTestData.Title, song.Title, "field CurrentSong.Title") + } +} + +func TestStatusCommands(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + status, err := mpc.Status() + if assert.NoError(t, err) { + assert.Equal(t, statusTestData.Audio, status.Audio, "field Status.Audio") + assert.Equal(t, statusTestData.State, status.State, "field Status.State") + assert.Equal(t, statusTestData.Duration, status.Duration, "field Status.Duration") + assert.Equal(t, statusTestData.Elapsed, status.Elapsed, "field Status.Elapsed") + assert.Equal(t, statusTestData.Error, status.Error, "field Status.Error") + assert.Equal(t, statusTestData.Playlist, status.Playlist, "field Status.Playlist") + assert.Equal(t, statusTestData.State, status.State, "field Status.State") + assert.Equal(t, statusTestData.Song, status.Song, "field Status.Song") + assert.Equal(t, statusTestData.Songid, status.Songid, "field Status.Songid") + } + + err = mpc.ClearError() + assert.NoError(t, err) +} + +func TestStatsCommand(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + stats, err := mpc.Stats() + if assert.NoError(t, err) { + assert.Equal(t, statsTestData.Artists, stats.Artists, "field Stats.Artists") + assert.Equal(t, statsTestData.Albums, stats.Albums, "field Stats.Albums") + assert.Equal(t, statsTestData.DBplaytime, stats.DBplaytime, "field Stats.DBplaytime") + assert.Equal(t, statsTestData.DBupdate, stats.DBupdate, "field Stats.DBupdate") + assert.Equal(t, statsTestData.Playtime, stats.Playtime, "field Stats.Playtime") + assert.Equal(t, statsTestData.Songs, stats.Songs, "field Stats.Songs") + assert.Equal(t, statsTestData.Uptime, stats.Uptime, "field Stats.Uptime") + } +} + +func TestControllingPlaybackCommands(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + err = mpc.Next() + assert.NoError(t, err) + + err = mpc.Pause(false) + assert.NoError(t, err) + err = mpc.Pause(true) + assert.NoError(t, err) + + err = mpc.Play(-1) + assert.NoError(t, err) + err = mpc.Play(0) + assert.NoError(t, err) + err = mpc.Play(10) + assert.NoError(t, err) + + err = mpc.PlayID(-1) + assert.NoError(t, err) + err = mpc.PlayID(0) + assert.NoError(t, err) + err = mpc.PlayID(10) + assert.NoError(t, err) + + err = mpc.Previous() + assert.NoError(t, err) + + err = mpc.Stop() + assert.NoError(t, err) +} + +func TestStoredPlaylistsCommands(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + err = mpc.Load("GreatestHits") + assert.NoError(t, err) + err = mpc.Load("nonexistent") + assert.Error(t, err) +} + +func TestConnectionSettingsCommands(t *testing.T) { + server, client := net.Pipe() + go mockMPDServer(t, server) + + mpc, err := NewClient("localhost:6600", client) + if err != nil { + t.Fatalf("Connect failed: %v", err) + } + + err = mpc.Ping() + assert.NoError(t, err) + err = mpc.Close() + assert.NoError(t, err) +} diff --git a/player/displayer.go b/player/displayer.go new file mode 100644 index 0000000..53c7660 --- /dev/null +++ b/player/displayer.go @@ -0,0 +1,57 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package player + +import ( + "fmt" + "sync" + "time" + + "github.com/vinymeuh/radiogagad/drivers/winstar" +) + +func Displayer(mpdinfo chan MPDInfo, stopscr chan struct{}, clrscr *sync.WaitGroup, msgch chan string) { + lcd := winstar.Display() + clrscr.Add(1) + + ticker := time.NewTicker(60 * time.Second) + go func() { + for { + select { + case <-ticker.C: + break + case <-stopscr: + lcd.Clear() + lcd.WriteAt(winstar.Line1, "Stopping") + time.Sleep(2 * time.Second) + lcd.Clear() + clrscr.Done() + return + case data := <-mpdinfo: + switch data.State { + case "play": + switch data.File[0:4] { + case "http": + msgch <- fmt.Sprintf("Playing radio='%s', title='%s'", + data.Name, data.Title) + lcd.Clear() + lcd.WriteAt(winstar.Line1, data.Name) + lcd.WriteAt(winstar.Line2, data.Title) + default: + msgch <- fmt.Sprintf("Playing artist='%s', album='%s', title='%s', %d/%d\n", + data.Artist, data.Album, data.Title, data.Song+1, data.PlaylistLength) + lcd.Clear() + lcd.WriteAt(winstar.Line1, data.Artist) + lcd.WriteAt(winstar.Line2, data.Title) + } + case "pause": + msgch <- "Player paused" + default: + lcd.Clear() + msgch <- "Player stopped" + } + } + } + }() +} diff --git a/player/mpdfetcher.go b/player/mpdfetcher.go new file mode 100644 index 0000000..6952da4 --- /dev/null +++ b/player/mpdfetcher.go @@ -0,0 +1,51 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package player + +import ( + "fmt" + "time" + + "github.com/vinymeuh/radiogagad/mpd" +) + +type MPDInfo struct { + *mpd.Status + *mpd.CurrentSong +} + +func MPDFetcher(addr string, mpdinfo chan MPDInfo, msgch chan string) { + var previous mpd.CurrentSong + for { + mpc, err := mpd.Dial(addr) + if err != nil { + msgch <- fmt.Sprintf("MPD server not responding: %s", err) + time.Sleep(2 * time.Second) + continue + } + // infinite fetch loop + for { + status, err := mpc.Status() + if err != nil { + msgch <- fmt.Sprintf("Failed to retrieve MPD Status: %s", err) + //@FIXME: error handling + } + + cs, err := mpc.CurrentSong() + if err != nil { + msgch <- fmt.Sprintf("Failed to retrieve MPD CurrentSong: %s", err) + //@FIXME: error handling + } + + // pass data to the Displayer + if cs.Name != previous.Name || cs.Title != previous.Title { + mpdinfo <- MPDInfo{Status: status, CurrentSong: cs} + previous = *cs + } + + // waits for notifications from MPD server + mpc.Idle("player") + } + } +} diff --git a/player/powerbutton.go b/player/powerbutton.go new file mode 100644 index 0000000..b1e9d72 --- /dev/null +++ b/player/powerbutton.go @@ -0,0 +1,62 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package player + +import ( + "fmt" + "os/exec" + "strings" + + "periph.io/x/periph/conn/gpio" + "periph.io/x/periph/conn/gpio/gpioreg" + "periph.io/x/periph/host" +) + +const ( + GPIO_BOOTOK = "GPIO22" + GPIO_SHUTDOWN = "GPIO17" + GPIO_SOFT_SHUTDOWN = "GPIO4" + CMD_SHUTDOWN = "/sbin/shutdown -h -P now" +) + +// PowerButton is responsible to start a system shutdown when button is fired +func PowerButton(msgch chan string) { + if _, err := host.Init(); err != nil { + msgch <- fmt.Sprintf("Failed to run host.Init(): %v", err) + return + } + + pinBootOk := gpioreg.ByName(GPIO_BOOTOK) + if pinBootOk == nil { + msgch <- "Failed to find pinBootOk" + return + } + if err := pinBootOk.Out(gpio.High); err != nil { + msgch <- fmt.Sprintf("Failed to setup pinBootOk: %v", err) + return + } + + pinShutdown := gpioreg.ByName(GPIO_SHUTDOWN) + if pinShutdown == nil { + msgch <- "Failed to find pinShutdown" + return + } + if err := pinShutdown.In(gpio.PullDown, gpio.RisingEdge); err != nil { + msgch <- fmt.Sprintf("Failed to setup pinShutdown: %v", err) + return + } + + go func() { + msgch <- "Power button successfully setup" + for pinShutdown.WaitForEdge(-1) { + msgch <- "Power button fired" + msgch <- fmt.Sprintf("Running command '%s'", CMD_SHUTDOWN) + cmdA := strings.Split(CMD_SHUTDOWN, " ") + cmd := exec.Command(cmdA[0], cmdA[1:]...) + cmd.Stdout = nil + cmd.Stderr = nil + cmd.Run() + } + }() +} diff --git a/player/starter.go b/player/starter.go new file mode 100644 index 0000000..bb7a8a7 --- /dev/null +++ b/player/starter.go @@ -0,0 +1,55 @@ +// Copyright 2019 VinyMeuh. All rights reserved. +// Use of the source code is governed by a MIT-style license that can be found in the LICENSE file. + +package player + +import ( + "fmt" + "time" + + "github.com/vinymeuh/radiogagad/mpd" +) + +const ( + STARTUP_MAX_RETRIES = 10 + STARTUP_RETRY_DELAY = 2 +) + +// Starter loads and starts playing a playlist +// In case of the MPD server is not responding, retry for a maximum of +// STARTUP_MAX_RETRIES spaced by STARTUP_RETRY_DELAY seconds. +func Starter(address string, playlists []string, msgch chan string) { + var ( + mpc *mpd.Client + err error + ) + + retry := 1 + for { + if mpc, err = mpd.Dial(address); err == nil { + break + } + msgch <- fmt.Sprintf("MPD server not responding: %s", err) + msgch <- fmt.Sprintf("Waits %ds before retry", STARTUP_RETRY_DELAY) + retry++ + if retry > STARTUP_MAX_RETRIES { + msgch <- fmt.Sprintf("Unable to contact MPD server after %d retries, we give up", STARTUP_MAX_RETRIES) + return + } + time.Sleep(STARTUP_RETRY_DELAY * time.Second) + } + + for _, playlist := range playlists { + if err := mpc.Load(playlist); err != nil { + msgch <- fmt.Sprintf("Failed to load playlist %s (%s)", playlist, err) + continue + } + if err := mpc.Play(-1); err != nil { + msgch <- fmt.Sprintf("Failed to start playing playlist %s: %s", playlist, err) + } else { + msgch <- fmt.Sprintf("Successfully started playing playlist '%s'", playlist) + return + } + } + msgch <- "Unable to load ANY playlists" +} diff --git a/public/I-SABRE-V3_FR_1_1.jpg b/public/I-SABRE-V3_FR_1_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d0f83bb719b6247aeaa599c12c38f29fcadb6ac GIT binary patch literal 97435 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 Uf9MVjz5h8ro9X2ms{A$nABxtCvH$=8 literal 0 HcmV?d00001 diff --git a/radiogagad.service b/radiogagad.service new file mode 100644 index 0000000..fc66c63 --- /dev/null +++ b/radiogagad.service @@ -0,0 +1,10 @@ +[Unit] +Description=radiogagad +After=mpd.service + +[Service] +#Environment="RGGD_STARTUP_PLAYLISTS=" +ExecStart=/usr/local/bin/radiogagad + +[Install] +WantedBy=multi-user.target \ No newline at end of file