From e60565739559d38c6ba448b4c573534964491c5e Mon Sep 17 00:00:00 2001 From: Johannes Theiner Date: Wed, 27 May 2020 12:06:09 +0200 Subject: [PATCH] A3: working version, i hope --- go/TrafficLights/TrafficLight.go | 164 ++++++++++++++------------- mCRL2/TrafficLights/v4/v4_spec.mcrl2 | 1 - 2 files changed, 85 insertions(+), 80 deletions(-) diff --git a/go/TrafficLights/TrafficLight.go b/go/TrafficLights/TrafficLight.go index 5256517..7234787 100644 --- a/go/TrafficLights/TrafficLight.go +++ b/go/TrafficLights/TrafficLight.go @@ -4,7 +4,7 @@ import ( "fmt" ) -var debuggingAllowed = true +var printDebugMessages = false type CardinalDirection string @@ -15,131 +15,137 @@ const ( west = CardinalDirection("West") ) -var Directions = []CardinalDirection{ - north, south, east, west, -} - -type Colour string - -const ( - red = Colour("\u001B[31m Red \u001B[0m") - green = Colour("\u001B[33m Green \u001B[0m") - yellow = Colour("\u001B[32m Yellow \u001B[0m") -) - -var Colours = []Colour{ - red, green, yellow, -} - func nextDirection(currentDirection CardinalDirection) CardinalDirection { switch currentDirection { case north: return east - case south: - return west case east: return south + case south: + return west case west: return north - default: - return north } - + return north } -func nextColour(currentColour Colour) Colour { - switch currentColour { - case red: - return green - case green: - return yellow - case yellow: - return red - default: - return red +func oppositeDirection(currentDirection CardinalDirection) CardinalDirection { + switch currentDirection { + case north: + return south + case east: + return west + case south: + return north + case west: + return east } + return north +} + +type Colour int + +const ( + red Colour = iota + green + yellow +) + +func (colour Colour) String() string { + switch colour { + case red: + return "Red" + case yellow: + return "Yellow" + case green: + return "Green" + default: + return "null" + } +} + +func nextColour(colour Colour) Colour { + return (colour + 1) % (yellow + 1) +} + +var northChannel = make(chan string) +var southChannel = make(chan string) +var eastChannel = make(chan string) +var westChannel = make(chan string) + +func getChannel(direction CardinalDirection) chan string { + switch direction { + case north: + return northChannel + case south: + return northChannel + case east: + return eastChannel + case west: + return eastChannel + } + return nil } func main() { var quitChannel = make(chan string) - var northColour = make(chan Colour, 2) - var southColour = make(chan Colour, 2) - var eastColour = make(chan Colour, 2) - var westColour = make(chan Colour, 2) - - var northDirection = make(chan string, 2) - var southDirection = make(chan string, 2) - var eastDirection = make(chan string, 2) - var westDirection = make(chan string, 2) - - go TrafficLight(north, northColour, southColour, northDirection, eastDirection, southDirection) - go TrafficLight(south, southColour, northColour, southDirection, westDirection, northDirection) - go TrafficLight(east, eastColour, westColour, eastDirection, southDirection, westDirection) - go TrafficLight(west, westColour, eastColour, westDirection, northDirection, eastDirection) + go TrafficLight(north) + go TrafficLight(south) + go TrafficLight(east) + go TrafficLight(west) <-quitChannel } -func TrafficLight(direction CardinalDirection, currentColour <-chan Colour, oppositeColour chan<- Colour, currentDirection <-chan string, nextDirectionChan chan<- string, oppositeDirection chan<- string) { +func TrafficLight(direction CardinalDirection) { var colour = red - if direction != north && direction != south { - nextDirectionChan <- string(nextDirection(direction)) - + if direction == east || direction == west { + handover("changeDirection", direction) } for { show(direction, colour) if colour == red { - syncLight(currentDirection, oppositeDirection) - changeDirection(direction, currentDirection, nextDirectionChan) + sync("wait", direction) + handover("changeDirection", direction) } - colour = changeLight(colour, currentColour, oppositeColour) + sync("changeLight"+string(nextColour(colour)), direction) + colour = nextColour(colour) } } -func syncLight(currentDirection <-chan string, oppositeDirection chan<- string) { - oppositeDirection <- "sync" - select { - case msg := <-currentDirection: - if msg == "sync" { - return +func handover(message string, direction CardinalDirection) { + getChannel(nextDirection(direction)) <- message - } + select { + case msg := <-getChannel(direction): + debug(msg) } } -func changeDirection(direction CardinalDirection, currentDirection <-chan string, nextDirectionChan chan<- string) { - nextDirectionChan <- string(nextDirection(direction)) - select { - case msg := <-currentDirection: - if msg == string(direction) { - return - } - } -} +func sync(message string, direction CardinalDirection) { + defer debug(string(direction) + " done with message " + message) -func changeLight(colour Colour, currentColour <-chan Colour, oppositeColour chan<- Colour) Colour { - oppositeColour <- nextColour(colour) + debug(string(direction) + " sync with message " + message) select { - case msg := <-currentColour: - if msg == nextColour(colour) { - return nextColour(colour) - } + case getChannel(direction) <- message: + case msg := <-getChannel(direction): + debug(msg) } - return colour + } func show(direction CardinalDirection, colour Colour) { - fmt.Println(string(direction), " : ", string(colour)) + fmt.Println(string(direction), " : ", colour.String()) } func debug(message string) { - if debuggingAllowed { - fmt.Println("Debug:", message) + if printDebugMessages { + fmt.Println("Debug: " + message) } } diff --git a/mCRL2/TrafficLights/v4/v4_spec.mcrl2 b/mCRL2/TrafficLights/v4/v4_spec.mcrl2 index 0257d0e..2e3bfaf 100644 --- a/mCRL2/TrafficLights/v4/v4_spec.mcrl2 +++ b/mCRL2/TrafficLights/v4/v4_spec.mcrl2 @@ -52,7 +52,6 @@ proc -> wait . ChangeDirection(direction) %Richtungswechsel, wenn wieder zurück . ChangeLight(direction, colour) % -> zur nächsten Farbe wechseln. <> ChangeLight(direction, colour) %ansonsten zum nächsten Zustand wechseln. - ; ChangeDirection(direction : CardinalDirection) =