More configurability and locase colournames
Signed-off-by: Martyn Ranyard <m@rtyn.berlin>
This commit is contained in:
		
							parent
							
								
									8a18a1f4b7
								
							
						
					
					
						commit
						c278cd2a58
					
				
					 3 changed files with 78 additions and 32 deletions
				
			
		|  | @ -3,7 +3,7 @@ kind: Deployment | ||||||
| metadata: | metadata: | ||||||
|   labels: |   labels: | ||||||
|     run: LEDController |     run: LEDController | ||||||
|   name: LEDController |   name: ledcontroller | ||||||
| spec: | spec: | ||||||
|   progressDeadlineSeconds: 600 |   progressDeadlineSeconds: 600 | ||||||
|   replicas: 1 |   replicas: 1 | ||||||
|  | @ -23,9 +23,20 @@ spec: | ||||||
|         run: LEDController |         run: LEDController | ||||||
|     spec: |     spec: | ||||||
|       containers: |       containers: | ||||||
|       - image: imartyn/LEDController:devel |       - env: | ||||||
|  |         - name: LISTEN_PORT | ||||||
|  |           value: "5353" | ||||||
|  |         - name: PANEL_IP | ||||||
|  |           value: "192.168.1.139" | ||||||
|  |         - name: PANEL_WIDTH | ||||||
|  |           value: "68" | ||||||
|  |         - name: PANEL_HEIGHT | ||||||
|  |           value: "4" | ||||||
|  |         - name: PANEL_BRIGHTNESS | ||||||
|  |           value: "10" | ||||||
|  |         image: imartyn/ledcontroller:0.0-linux-amd64 | ||||||
|         imagePullPolicy: IfNotPresent |         imagePullPolicy: IfNotPresent | ||||||
|         name: LEDController |         name: ledcontroller | ||||||
|         ports: |         ports: | ||||||
|         - name: web |         - name: web | ||||||
|           containerPort: 5353 |           containerPort: 5353 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"time" | 	"time" | ||||||
| 	"strconv" | 	"strconv" | ||||||
|  | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func HealthHandler(response http.ResponseWriter, request *http.Request) { | func HealthHandler(response http.ResponseWriter, request *http.Request) { | ||||||
|  | @ -35,7 +36,7 @@ func PatternHandler(response http.ResponseWriter, request *http.Request) { | ||||||
| 	vars := mux.Vars(request) | 	vars := mux.Vars(request) | ||||||
| 	response.Header().Add("Content-type", "text/plain") | 	response.Header().Add("Content-type", "text/plain") | ||||||
| 	var e queue.QueueItem | 	var e queue.QueueItem | ||||||
| 	e.Effect = vars["pattern"] | 	e.Effect = strings.ToLower(vars["pattern"]) | ||||||
| 	_, found := vars["duration"] | 	_, found := vars["duration"] | ||||||
| 	if found { | 	if found { | ||||||
| 		i, _ := strconv.Atoi(vars["duration"]) | 		i, _ := strconv.Atoi(vars["duration"]) | ||||||
|  | @ -68,7 +69,7 @@ func ColourHandler(response http.ResponseWriter, request *http.Request) { | ||||||
| 	} | 	} | ||||||
| 	var c queue.RGBcolor | 	var c queue.RGBcolor | ||||||
| 	for cn, cv := range(colornames.Map) { | 	for cn, cv := range(colornames.Map) { | ||||||
| 		if cn == vars["name"] { | 		if cn == strings.ToLower(vars["name"]) { | ||||||
| 			c[0] = cv.R | 			c[0] = cv.R | ||||||
| 			c[1] = cv.G | 			c[1] = cv.G | ||||||
| 			c[2] = cv.B | 			c[2] = cv.B | ||||||
|  | @ -93,7 +94,7 @@ func FadeHandler(response http.ResponseWriter, request *http.Request) { | ||||||
| 	} | 	} | ||||||
| 	var c queue.RGBcolor | 	var c queue.RGBcolor | ||||||
| 	for cn, cv := range(colornames.Map) { | 	for cn, cv := range(colornames.Map) { | ||||||
| 		if cn == vars["namefrom"] { | 		if cn == strings.ToLower(vars["namefrom"]) { | ||||||
| 			c[0] = cv.R | 			c[0] = cv.R | ||||||
| 			c[1] = cv.G | 			c[1] = cv.G | ||||||
| 			c[2] = cv.B | 			c[2] = cv.B | ||||||
|  | @ -101,7 +102,7 @@ func FadeHandler(response http.ResponseWriter, request *http.Request) { | ||||||
| 	} | 	} | ||||||
| 	e.SeedColour = c | 	e.SeedColour = c | ||||||
| 	for cn, cv := range(colornames.Map) { | 	for cn, cv := range(colornames.Map) { | ||||||
| 		if cn == vars["nameto"] { | 		if cn == strings.ToLower(vars["nameto"]) { | ||||||
| 			c[0] = cv.R | 			c[0] = cv.R | ||||||
| 			c[1] = cv.G | 			c[1] = cv.G | ||||||
| 			c[2] = cv.B | 			c[2] = cv.B | ||||||
|  | @ -112,7 +113,7 @@ func FadeHandler(response http.ResponseWriter, request *http.Request) { | ||||||
| 	fmt.Fprint(response, "OKAY") | 	fmt.Fprint(response, "OKAY") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func HandleHTTP(queueChannel chan queue.QueueItem) { | func HandleHTTP(queueChannel chan queue.QueueItem, Port int) { | ||||||
| 	globalQueue = queueChannel | 	globalQueue = queueChannel | ||||||
| 	r := mux.NewRouter() | 	r := mux.NewRouter() | ||||||
| 	loggedRouter := handlers.LoggingHandler(os.Stdout, r) | 	loggedRouter := handlers.LoggingHandler(os.Stdout, r) | ||||||
|  | @ -131,10 +132,10 @@ func HandleHTTP(queueChannel chan queue.QueueItem) { | ||||||
| 	http.Handle("/", r) | 	http.Handle("/", r) | ||||||
| 	srv := &http.Server{ | 	srv := &http.Server{ | ||||||
| 		Handler:      loggedRouter, | 		Handler:      loggedRouter, | ||||||
| 		Addr:         "0.0.0.0:5353", | 		Addr:         "0.0.0.0:"+strconv.Itoa(Port), | ||||||
| 		WriteTimeout: 15 * time.Second, | 		WriteTimeout: 15 * time.Second, | ||||||
| 		ReadTimeout:  15 * time.Second, | 		ReadTimeout:  15 * time.Second, | ||||||
| 	} | 	} | ||||||
| 	fmt.Println("Listening on 0.0.0.0:5353") | 	fmt.Printf("Listening on 0.0.0.0:%d", Port) | ||||||
| 	srv.ListenAndServe() | 	srv.ListenAndServe() | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										78
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										78
									
								
								main.go
									
										
									
									
									
								
							|  | @ -4,6 +4,8 @@ import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"log" | 	"log" | ||||||
| 	"time" | 	"time" | ||||||
|  | 	"strconv" | ||||||
|  | 	"os" | ||||||
| 
 | 
 | ||||||
| 	webserver "git.martyn.berlin/martyn/LEDController/internal/webserver" | 	webserver "git.martyn.berlin/martyn/LEDController/internal/webserver" | ||||||
| 	queue "git.martyn.berlin/martyn/LEDController/internal/queue" | 	queue "git.martyn.berlin/martyn/LEDController/internal/queue" | ||||||
|  | @ -42,9 +44,37 @@ func reduceBrightness(universe [512]byte, percentage int) [512]byte{ | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
| 	go func() { | 	go func() { | ||||||
| 		fmt.Printf("Starting webserver on port %s\n", "5353") | 		var err error | ||||||
| 		webserver.HandleHTTP(globalEffectChannel) | 	    listenPort := 5353 | ||||||
|  | 		if os.Getenv("LISTEN_PORT") != "" { | ||||||
|  | 			listenPort, err = strconv.Atoi(os.Getenv("LISTEN_PORT")) | ||||||
|  | 			if err != nil { | ||||||
|  | 				listenPort = 5353 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fmt.Printf("Starting webserver on port %d\n", listenPort) | ||||||
|  | 		webserver.HandleHTTP(globalEffectChannel, listenPort) | ||||||
| 	}() | 	}() | ||||||
|  | 
 | ||||||
|  | 	PanelIP := os.Getenv("PANEL_IP") | ||||||
|  | 	if PanelIP == "" { | ||||||
|  | 		PanelIP = "127.0.0.1" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	PanelWidth, err := strconv.Atoi(os.Getenv("PANEL_WIDTH")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		PanelWidth = 68 | ||||||
|  | 	} | ||||||
|  | 	PanelHeight, err := strconv.Atoi(os.Getenv("PANEL_HEIGHT")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		PanelHeight = 4 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	PanelBrightness, err := strconv.Atoi(os.Getenv("PANEL_BRIGHTNESS")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		PanelBrightness = 100 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	//instead of "" you could provide an ip-address that the socket should bind to | 	//instead of "" you could provide an ip-address that the socket should bind to | ||||||
| 	trans, err := sacn.NewTransmitter("", [16]byte{1, 2}, "test") | 	trans, err := sacn.NewTransmitter("", [16]byte{1, 2}, "test") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -57,20 +87,24 @@ func main() { | ||||||
| 		//deactivate the channel on exit | 		//deactivate the channel on exit | ||||||
| 		defer close(channels[i]) | 		defer close(channels[i]) | ||||||
| 		trans.SetMulticast(uint16(i+1), false) //this specific setup will not multicast on windows, | 		trans.SetMulticast(uint16(i+1), false) //this specific setup will not multicast on windows, | ||||||
| 		trans.SetDestinations(uint16(i+1), []string{"192.168.1.139"}) | 		trans.SetDestinations(uint16(i+1), []string{PanelIP}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Plasma for start frame | 	// Plasma for start frame | ||||||
| 	rearranged := remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.PlasmaPanel(68, 4, 40))) | 	rearranged := remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.PlasmaPanel(PanelWidth, PanelHeight, 40))) | ||||||
| 	currentFrame[0] = remapping.Slice512(rearranged[0]) | 	currentFrame[0] = remapping.Slice512(rearranged[0]) | ||||||
| 	currentFrame[1]	= remapping.Slice512(rearranged[1]) | 	currentFrame[1]	= remapping.Slice512(rearranged[1]) | ||||||
| 	var e queue.QueueItem | 	var e queue.QueueItem | ||||||
| 	e.Effect = "red" | 	e.Effect = "red" | ||||||
| 	e.Duration = 40 * 50 | 	e.Duration = 40 * 50 | ||||||
| 	globalEffectChannel <- e | 	globalEffectChannel <- e | ||||||
| 	e.Effect = "plasma" | 	e.Effect = "colour" | ||||||
| 	e.Duration = 0 | 	e.Duration = 40 * 10 | ||||||
| 	e.Speed = 40 | 	e.SeedColour[0] = 0 | ||||||
|  | 	e.SeedColour[1] = 255 | ||||||
|  | 	e.SeedColour[2] = 0 | ||||||
|  | 	globalEffectChannel <- e | ||||||
|  | 	e.Effect = "default" | ||||||
| 	globalEffectChannel <- e | 	globalEffectChannel <- e | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go func() { | ||||||
|  | @ -85,40 +119,40 @@ func main() { | ||||||
| 			var rearranged [][]byte | 			var rearranged [][]byte | ||||||
| 			switch currentEffect.Effect { | 			switch currentEffect.Effect { | ||||||
| 				case "line": | 				case "line": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.ZigZag(68, 4))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.ZigZag(PanelWidth, PanelHeight))) | ||||||
| 				case "plasma": | 				case "plasma": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.PlasmaPanel(68, 4, currentEffect.Speed))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.PlasmaPanel(PanelWidth, PanelHeight, currentEffect.Speed))) | ||||||
| 				case "red": | 				case "red": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.RedPanel(68,4))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.RedPanel(PanelWidth,PanelHeight))) | ||||||
| 				case "random": | 				case "random": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.RandomColourPanel(68,4,currentEffect.Speed))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.RandomColourPanel(PanelWidth,PanelHeight,currentEffect.Speed))) | ||||||
| 				case "linearplasma": | 				case "linearplasma": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, patterns.LinearPlasma(68*4)) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, patterns.LinearPlasma(PanelWidth*PanelHeight)) | ||||||
| 				case "gradientred": | 				case "gradientred": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, patterns.Gradient(255, 0, 0, 0, 0, 255, 0, 68*4)) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, patterns.Gradient(255, 0, 0, 0, 0, 255, 0, PanelWidth*PanelHeight)) | ||||||
| 				case "sine": | 				case "sine": | ||||||
| 					var black patterns.RGBcolor | 					var black patterns.RGBcolor | ||||||
| 					var red patterns.RGBcolor | 					var red patterns.RGBcolor | ||||||
| 					red[0] = 255 | 					red[0] = 255 | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.Sinewave(68, 4, black, red, currentEffect.Speed))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.Sinewave(PanelWidth, PanelHeight, black, red, currentEffect.Speed))) | ||||||
| 				case "sinechase": | 				case "sinechase": | ||||||
| 					var black patterns.RGBcolor | 					var black patterns.RGBcolor | ||||||
| 					var red patterns.RGBcolor | 					var red patterns.RGBcolor | ||||||
| 					red[0] = 255 | 					red[0] = 255 | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.SineChase(68, 4, black, red, currentEffect.Speed))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.SineChase(PanelWidth, PanelHeight, black, red, currentEffect.Speed))) | ||||||
| 				case "plasmapulse": | 				case "plasmapulse": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.PlasmaColourPanel(68,4, currentEffect.Speed))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.PlasmaColourPanel(PanelWidth,PanelHeight, currentEffect.Speed))) | ||||||
| 				case "colour": | 				case "colour": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.FillPanel(68,4, currentEffect.SeedColour[0], currentEffect.SeedColour[1], currentEffect.SeedColour[2]))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.FillPanel(PanelWidth,PanelHeight, currentEffect.SeedColour[0], currentEffect.SeedColour[1], currentEffect.SeedColour[2]))) | ||||||
| 				case "fade": | 				case "fade": | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.GradientPanel(68,4, currentEffect.SeedColour, currentEffect.SecondColour))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, true, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.GradientPanel(PanelWidth,PanelHeight, currentEffect.SeedColour, currentEffect.SecondColour))) | ||||||
| 			    default: | 			    default: | ||||||
| 					rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.FillPanel(68,4, 128,0,128))) | 					rearranged = remapping.SliceRearrange(PanelWidth, PanelHeight, false, remapping.XYGridToLinear(PanelWidth, PanelHeight, patterns.FillPanel(PanelWidth,PanelHeight, 128,0,128))) | ||||||
| 			} | 			} | ||||||
| 			//rearranged := remapping.SliceRearrange(68,4,true,linearPlasma(68*4)) | 			//rearranged := remapping.SliceRearrange(PanelWidth,PanelHeight,true,linearPlasma(PanelWidth*PanelHeight)) | ||||||
| 			sema <- struct{}{} // acquire token | 			sema <- struct{}{} // acquire token | ||||||
| 			currentFrame[0] = reduceBrightness(remapping.Slice512(rearranged[0]),10) | 			currentFrame[0] = reduceBrightness(remapping.Slice512(rearranged[0]),PanelBrightness) | ||||||
| 			currentFrame[1]	= reduceBrightness(remapping.Slice512(rearranged[1]),10) | 			currentFrame[1]	= reduceBrightness(remapping.Slice512(rearranged[1]),PanelBrightness) | ||||||
| 			<- sema | 			<- sema | ||||||
| 			time.Sleep(40 * time.Millisecond) | 			time.Sleep(40 * time.Millisecond) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue