diff --git a/gpio.go b/gpio.go index 2505dca..80137f1 100644 --- a/gpio.go +++ b/gpio.go @@ -829,13 +829,26 @@ func GPIOOutPin(name string, command string) { if command == "on" { switch io.Type { case "gpio": - log.Printf("debug: Turning On %v at pin %v Output GPIO\n", io.Name, io.PinNo) - gpio.NewOutput(io.PinNo, true) + if !io.Inverted { + log.Printf("debug: Turning On %v at pin %v Output GPIO (Non-Inverting)\n", io.Name, io.PinNo) + gpio.NewOutput(io.PinNo, true) + } else { + log.Printf("debug: Turning On %v at pin %v Output GPIO (Inverting)\n", io.Name, io.PinNo) + gpio.NewOutput(io.PinNo, false) + } case "mcp23017": - log.Printf("debug: Turning On %v at pin %v Output mcp23017\n", io.Name, io.PinNo) - err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) - if err != nil { - log.Printf("error: Error Turning On %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + if !io.Inverted { + log.Printf("debug: Turning On %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + } + } else { + log.Printf("debug: Turning On %v at pin %v Output mcp23017 (Non-Inverted)\n", io.Name, io.PinNo) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + } } default: log.Println("error: GPIO Types Currently Supported are gpio or mcp23017 only!") @@ -846,13 +859,26 @@ func GPIOOutPin(name string, command string) { if command == "off" { switch io.Type { case "gpio": - log.Printf("debug: Turning Off %v at pin %v Output GPIO\n", io.Name, io.PinNo) - gpio.NewOutput(io.PinNo, false) + if !io.Inverted { + log.Printf("debug: Turning Off %v at pin %v Output GPIO (Non-Inverting)\n", io.Name, io.PinNo) + gpio.NewOutput(io.PinNo, false) + } else { + log.Printf("debug: Turning Off %v at pin %v Output GPIO (Inverting)\n", io.Name, io.PinNo) + gpio.NewOutput(io.PinNo, true) + } case "mcp23017": - log.Printf("debug: Turning Off %v at pin %v Output mcp23017\n", io.Name, io.PinNo) - err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) - if err != nil { - log.Printf("error: Error Turning Off %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + if !io.Inverted { + log.Printf("debug: Turning Off %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + } + } else { + log.Printf("debug: Turning Off %v at pin %v Output mcp23017 (Non-Inverted)\n", io.Name, io.PinNo) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 with error %v\n", io.Name, io.PinNo, err) + } } default: log.Println("error: GPIO Types Currently Supported are gpio or mcp23017 only!") @@ -906,29 +932,55 @@ func GPIOOutAll(name string, command string) { switch io.Type { case "gpio": if command == "on" { - log.Printf("debug: Turning On %v Output GPIO\n", io.Name) - gpio.NewOutput(io.PinNo, true) + if io.Inverted { + log.Printf("debug: Turning On %v Output GPIO (Inverted)\n", io.Name) + gpio.NewOutput(io.PinNo, false) + } else { + log.Printf("debug: Turning On %v Output GPIO (Not-Inverted)\n", io.Name) + gpio.NewOutput(io.PinNo, true) + } } if command == "off" { - log.Printf("debug: Turning Off %v Output GPIO\n", io.Name) - gpio.NewOutput(io.PinNo, false) + if io.Inverted { + log.Printf("debug: Turning Off %v Output GPIO (Inverted)\n", io.Name) + gpio.NewOutput(io.PinNo, true) + } else { + log.Printf("debug: Turning Off %v Output GPIO (Not-Inverted)\n", io.Name) + gpio.NewOutput(io.PinNo, false) + } } case "mcp23017": if command == "on" { - log.Printf("debug: Turning On %v Output mcp23017\n", io.Name) if D[io.ID] != nil { - err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) - if err != nil { - log.Printf("error: Error Turning On %v at pin %v Output mcp23017\n", io.Name, io.PinNo) + if io.Inverted { + log.Printf("debug: Turning On %v Output mcp23017 (Inverted)\n", io.Name) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + } + } else { + log.Printf("debug: Turning On %v Output mcp23017 (Not Inverted)\n", io.Name) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) + if err != nil { + log.Printf("error: Error Turning On %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + } } } } if command == "off" { - log.Printf("debug: Turning Off %v Output mcp23017\n", io.Name) if D[io.ID] != nil { - err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) - if err != nil { - log.Printf("error: Error Turning Off %v at pin %v Output mcp23017\n", io.Name, io.PinNo) + if io.Inverted { + log.Printf("debug: Turning Off %v Output mcp23017 (Inverted)\n", io.Name) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.LOW) + if err != nil { + log.Printf("error: Error Turning Off %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + } + } else { + log.Printf("debug: Turning Off %v Output mcp23017 (Not Inverted)\n", io.Name) + err := D[io.ID].DigitalWrite(uint8(io.PinNo), mcp23017.HIGH) + if err != nil { + log.Printf("error: Error Turning Off %v at pin %v Output mcp23017 (Inverted)\n", io.Name, io.PinNo) + } } } } diff --git a/version.go b/version.go index 14a1ab1..48f8422 100644 --- a/version.go +++ b/version.go @@ -31,11 +31,10 @@ package talkkonnect const ( - talkkonnectVersion string = "2.13.06" - talkkonnectReleased string = "Apr 11 2022" + talkkonnectVersion string = "2.14.01" + talkkonnectReleased string = "May 02 2022" ) /* Release Notes -1. User Event Shown with User Responsible for Event in Log -2. Participant LED logical Bug Fixed +1. Support Inverting in GPIO Outputs For Convinience (Configurable by XML) */ diff --git a/xmlparser.go b/xmlparser.go index 481ec2f..c26abac 100644 --- a/xmlparser.go +++ b/xmlparser.go @@ -316,6 +316,7 @@ type ConfigStruct struct { PinNo uint `xml:"pinno,attr"` Type string `xml:"type,attr"` ID int `xml:"chipid,attr"` + Inverted bool `xml:"inverted,attr"` Enabled bool `xml:"enabled,attr"` } `xml:"pin"` } `xml:"pins"` @@ -1171,7 +1172,7 @@ func printxmlconfig() { if Config.Global.Software.PrintVariables.PrintPins { log.Println("info: ------------ PINS -------------- ") for _, pins := range Config.Global.Hardware.IO.Pins.Pin { - log.Printf("info: Direction=%v Device%v Name=%v PinNo=%v Type=%v ID=%v Enabled=%v\n", pins.Direction, pins.Device, pins.Name, pins.PinNo, pins.Type, pins.ID, pins.Enabled) + log.Printf("info: Direction=%v Device%v Name=%v PinNo=%v Type=%v ID=%v Inverted=%v Enabled=%v\n", pins.Direction, pins.Device, pins.Name, pins.PinNo, pins.Type, pins.ID, pins.Inverted, pins.Enabled) } } else { log.Println("info: ------------ PINS -------------- SKIPPED")