+++ /dev/null
-package main
-
-import (
- gpio "github.com/warthog618/go-gpiocdev"
- "github.com/warthog618/go-gpiocdev/device/rpi"
- "log"
- "strconv"
-)
-
-type PTT interface {
- EngagePTT()
- DisengagePTT()
-}
-
-type COS interface {
- WaitForChannelClear()
- COSValue() bool
-}
-
-var ptt PTT = &DefaultPTT{}
-var cos COS = &DefaultCOS{}
-
-type PiPTT struct {
- pttLine *gpio.Line
-}
-
-type PiCOS struct {
- cosLine *gpio.Line
- clearWait chan bool
-}
-
-func InitRaspberryPiPTT(pttNum int, chipName string) {
- pttPin, err := rpi.Pin("GPIO" + strconv.Itoa(pttNum))
- if err != nil {
- log.Fatal("invalid PTT pin configured", ptt)
- }
- pttLine, err := gpio.RequestLine(chipName, pttPin, gpio.AsOutput(0))
- if err != nil {
- log.Fatal("unable to open requested pin for PTT GPIO:", ptt, ". Are you running as root?")
- }
- ptt = &PiPTT{
- pttLine: pttLine,
- }
-}
-
-func InitRaspberryPiCOS(cosNum int, chipName string) {
- var piCOS PiCOS
- piCOS.clearWait = make(chan bool)
- cosPin, err := rpi.Pin("GPIO" + strconv.Itoa(cosNum))
- if err != nil {
- log.Fatal("invalid COS Pin configured", cos)
- }
- cosHandler := func(event gpio.LineEvent) {
- if event.Type == gpio.LineEventFallingEdge {
- log.Println("COS: channel clear")
- close(piCOS.clearWait)
- piCOS.clearWait = make(chan bool)
- statusCollector.COS <- false
- }
- if event.Type == gpio.LineEventRisingEdge {
- log.Println("COS: channel in use")
- statusCollector.COS <- true
- }
- }
- cosLine, err := gpio.RequestLine(chipName, cosPin, gpio.AsInput, gpio.WithBothEdges, gpio.WithEventHandler(cosHandler))
- if err != nil {
- log.Fatal("unable to open requested pin for COS GPIO:", cos, ". Are you running as root?")
- }
- piCOS.cosLine = cosLine
- cos = &piCOS
-}
-
-func (g *PiCOS) COSValue() bool {
- val, err := g.cosLine.Value()
- if err != nil {
- log.Fatal("Unable to read COS value")
- }
- return val != 0
-}
-
-func (g *PiCOS) WaitForChannelClear() {
- ch := g.clearWait
- val, err := g.cosLine.Value()
- if err != nil || val == 0 {
- return
- }
- // wait for close
- <-ch
-}
-
-func (g *PiPTT) EngagePTT() {
- log.Println("PTT: on")
- g.pttLine.SetValue(1)
- statusCollector.PTT <- true
-}
-
-func (g *PiPTT) DisengagePTT() {
- log.Println("PTT: off")
- g.pttLine.SetValue(0)
- statusCollector.PTT <- false
-}
-
-type DefaultPTT struct {
-}
-
-func (g *DefaultPTT) EngagePTT() {
- statusCollector.PTT <- true
-}
-
-func (g *DefaultPTT) DisengagePTT() {
- statusCollector.PTT <- false
-}
-
-type DefaultCOS struct {
-}
-
-func (g *DefaultCOS) WaitForChannelClear() {
- log.Println("Assuming channel is clear since COS GPIO is not configured")
-}
-
-func (g *DefaultCOS) COSValue() bool {
- return false
-}