public static void Graph(GraphType gType, LEDPanel panel, int startX, int startY, int count, bool invertX = false, bool invertY = false) { switch (gType) { case GraphType.Horizontal: HorizontalLines(panel, startX, startY, count, invertX, invertY); break; case GraphType.Vertical: VerticalLines(panel, startX, startY, count, invertX, invertY); break; case GraphType.Square: Square(panel, startX, startY, count, invertX, invertY); break; case GraphType.DiagonalXFrom0: DiagonalLinesByXAxisFrom0(panel, startX, startY, count, invertX, invertY); break; case GraphType.DiagonalX: DiagonalLinesByXAxis(panel, startX, startY, count, invertX, invertY); break; case GraphType.Diamond: Diamond(panel, startX, startY, count, invertX, invertY); break; } }
private static int PlotLine(LEDPanel panel, ref int [,] values, Vector2Int start, Vector2Int end, int lcv, int count) { var xInc = start.x < end.x ? 1 : -1; var yInc = start.y < end.y ? 1 : -1; Vector2Int p = start; Vector2Int increment = new Vector2Int(xInc, yInc); int cutoff = 0; while (lcv < count && cutoff < 10000) { if (p == end) { break; } if (panel.InBounds(p) && !panel.IsSet(p.x, p.y)) { values[p.x, p.y] = 1; lcv++; } p += increment; cutoff++; } return(lcv); }
public void initializePanels() { for (int i = 0; i < LEDPanel.NUMPANELS; i++) { MyPanels[i] = new LEDPanel(); MyPanels[i].setOrientation(arrPanelInit[i, 0], arrPanelInit[i, 1], arrPanelInit[i, 2], arrPanelInit[i, 3], arrPanelInit[i, 4]); } }
private static void RenderFromArray(LEDPanel panel, int[,] values, bool invertX, bool invertY) { int xIncrement = invertX ? -1 : 1; int yIncrement = invertY ? -1 : 1; int lowX = 0, highX = values.GetLength(0) - 1; int lowY = 0, highY = values.GetLength(1) - 1; if (invertX) { int temp = lowX; lowX = highX; highX = temp; } if (invertY) { int temp = lowY; lowY = highY; highY = temp; } int[,] newValues = new int[values.GetLength(0), values.GetLength(1)]; /* * int oldX = 0, oldY = 0; * if (invertX || invertY) * { * for (int x = lowX; x <= highX; x += xIncrement) * { * for (int y = lowY; y <= highY; y += yIncrement) * { * newValues[x, y] = values[oldX, oldY]; * oldY++; * } * oldX++; * } * } * else * { * newValues = values; * } */ int oldX = lowX; for (int x = 0; x < values.GetLength(0); x++) { int oldY = lowY; for (int y = 0; y < values.GetLength(1); y++) { if (values[oldX, oldY] == 1) { panel.SetLED(x, y, true); } oldY += yIncrement; } oldX += xIncrement; } }
private static void DiagonalLinesByXAxis(LEDPanel panel, int startX, int startY, int count, bool invertX = false, bool invertY = false) { panel.ClearLED(); // boiler plate int xIncrement = 1; int yIncrement = 1; int lowX = 0, highX = panel.LEDArraySize - 1; int lowY = 0, highY = panel.LEDArraySize - 1; int deadEndX = panel.LEDArraySize - 1; int deadEndY = 0; panel.ClearLED(); int lcvX = startX; int lcvY = startY; int yOffset = 0, xOffset = 0; int[,] values = new int[panel.LEDArraySize, panel.LEDArraySize]; for (int lcv = 0; lcv < count; lcv++) { bool xWrap = false, yWrap = false; values[lcvX, lcvY] = 1; var msg = string.Format("setting x:{0},y:{1}, ", lcvX, lcvY); if (lcvX == deadEndX && lcvY == deadEndY) // dead end corner { IncrementOffsetValue(ref yOffset, startY, panel.LEDArraySize, yIncrement, true); lcvY = startY + yOffset; lcvX = lowX; xOffset = lowX - startX; } else { xWrap = IncrementValue(ref lcvX, panel.LEDArraySize, xIncrement); yWrap = IncrementValue(ref lcvY, panel.LEDArraySize, yIncrement); } if (xWrap) { IncrementOffsetValue(ref xOffset, startX, panel.LEDArraySize, xIncrement); lcvY = lowY; lcvX = startX + xOffset; } else if (yWrap) { IncrementOffsetValue(ref yOffset, startY, panel.LEDArraySize, yIncrement, true); lcvY = startY + yOffset; lcvX = lowX; } msg += string.Format(" next up x:{0}, y:{1}", lcvX, lcvY); //Debug.Log(msg); } RenderFromArray(panel, values, invertX, invertY); }
private Task DriveLEDPanel(LEDPanel panel) { TimeSpan updateInterval = TimeSpan.FromMinutes(5); DateTime lastUpdate = DateTime.MinValue; return(Task.Run(async() => { panel.Clear(); System.Xml.Linq.XNamespace ns = "http://www.w3.org/2005/Atom"; try { IEnumerable <string> entries = null; while (this.KeepRunning) { if (DateTime.Now > lastUpdate + updateInterval) { var request = System.Net.HttpWebRequest.CreateHttp("http://www.theverge.com/rss/index.xml"); var response = await request.GetResponseAsync(); var document = System.Xml.Linq.XDocument.Load(response.GetResponseStream()); entries = document .Descendants(ns + "title") .Select(x => x.Value); lastUpdate = DateTime.Now; } if (entries != null) { foreach (var entry in entries) { var buffer = panel.Render(" " + entry + " - "); panel.Display(buffer); } } else { await Task.Delay(TimeSpan.FromSeconds(5)); } } } catch (Exception ex) { var buffer = panel.Render(ex.ToString()); panel.Display(buffer); } })); }
private static void VerticalLines(LEDPanel panel, int startX, int startY, int count, bool invertX = false, bool invertY = false) { panel.ClearLED(); int lcvX = startX; int lcvY = 0; // boiler plate int xIncrement = 1; int yIncrement = 1; // int[,] values = new int[panel.LEDArraySize, panel.LEDArraySize]; for (int lcv = 0; lcv < count; lcv++) { values[lcvX, lcvY] = 1; if (IncrementValue(ref lcvY, panel.LEDArraySize, yIncrement)) { IncrementValue(ref lcvX, panel.LEDArraySize, xIncrement); } } RenderFromArray(panel, values, invertX, invertY); }
private static void Square(LEDPanel panel, int startX, int startY, int count, bool invertX = false, bool invertY = false) { panel.ClearLED(); // boiler plate int xIncrement = 1; int yIncrement = 1; var sqrt = Mathf.Sqrt(count); var width = (int)System.Math.Truncate(sqrt); if (sqrt > width) { width += 1; } int lowX = 0, highX = lowX + width; int lowY = 0, highY = lowY + width; int lcvX = startX; int lcvY = startY; // int[,] values = new int[panel.LEDArraySize, panel.LEDArraySize]; int widthLcv = 0; for (int lcv = 0; lcv < count; lcv++) { values[lcvX, lcvY] = 1; IncrementValue(ref lcvX, panel.LEDArraySize, xIncrement); widthLcv++; if (widthLcv >= width) { IncrementValue(ref lcvY, panel.LEDArraySize, yIncrement); lcvX = startX; widthLcv = 0; } } RenderFromArray(panel, values, invertX, invertY); }
private static void Diamond(LEDPanel panel, int startX, int startY, int count, bool invertX = false, bool invertY = false) { panel.ClearLED(); // early exit for 0 count, since we're not using a normal for loop structure here int[,] values = new int[panel.LEDArraySize, panel.LEDArraySize]; if (count == 0) { RenderFromArray(panel, values, invertX, invertY); return; } /* * // normalize the diamond data so we always have a shape that looks good * bool adjusted = false; * foreach (int val in DiamondBoundaries.Keys) * { * if (count <= val) * { * count = val; * var rad = DiamondBoundaries[val]; * startX = Mathf.Clamp(startX, rad, panel.LEDArraySize - 1 - rad); * startY = Mathf.Clamp(startY, rad, panel.LEDArraySize - 1 - rad); * adjusted = true; * break; * } * } * if (!adjusted) * { * var lastEntry = DiamondBoundaries.Last(); * count = lastEntry.Key; * var rad = lastEntry.Value; * startX = Mathf.Clamp(startX, rad, panel.LEDArraySize - 1 - rad); * startY = Mathf.Clamp(startY, rad, panel.LEDArraySize - 1 - rad); * } */ int radius = 0; int lcv = 0; bool done = false; var overflow = 10000; while (!done && lcv < overflow) { if (radius == 0) { values[startX, startY] = 1; // set center value lcv++; done = lcv >= count; } else { Vector2Int point1 = Vector2Int.zero, point2 = Vector2Int.zero; point1.Set(startX + radius, startY); point2.Set(startX, startY + radius); lcv = PlotLine(panel, ref values, point1, point2, lcv, count); done = lcv >= count; if (done) { break; } point1 = point2; point2.Set(startX - radius, startY); lcv = PlotLine(panel, ref values, point1, point2, lcv, count); done = lcv >= count; if (done) { break; } point1 = point2; point2.Set(startX, startY - radius); lcv = PlotLine(panel, ref values, point1, point2, lcv, count); done = lcv >= count; if (done) { break; } point1 = point2; point2.Set(startX + radius, startY); lcv = PlotLine(panel, ref values, point1, point2, lcv, count); done = lcv >= count; if (done) { break; } } radius++; } RenderFromArray(panel, values, invertX, invertY); }