private void UpdateFormat(ref FormatState state, StringBuilder data) { char[] trimChars = { ',' }; switch (state) { case FormatState.Idle: { var str = BoardUtil.SplitLine(data, 1); switch (str[0].ToLowerInvariant()) { case "board": if (data.ToString().Contains("INCH units")) { InchUnits = true; } break; case "user": str = BoardUtil.SplitLine(data, 8); var loc = new Vector2(); loc.X = ParseDouble(str[3].TrimEnd(trimChars)); loc.Y = ParseDouble(str[5].TrimEnd(trimChars)); OriginLocation = loc; OriginTurn = ParseDouble(str[7].TrimEnd(trimChars)); break; case "x": state = FormatState.ContourVertex; break; } break; } case FormatState.ContourVertex: { // update contour var str = BoardUtil.SplitLine(data, 2); var newVert = new Vector2(ParseDouble(str[0]), ParseDouble(str[1])); if (TopContour.Count > 0 && TopContour[TopContour.Count - 1] == newVert) { break; } TopContour.Add(newVert); break; } } }
private void Update(ref State currentState, ref FormatState fState, ref NailsState nState, ref PinsState pState, StringBuilder data) { if (data.Length == 0 || data[0] == '\r') { //currentState = State.Idle; return; } if (data[0] == '<') { currentState = State.Idle; } switch (currentState) { case State.Idle: switch (data.ToString()) { case "<<format.asc>>": currentState = State.Format; break; case "<<nails.asc>>": currentState = State.Nails; break; case "<<pins.asc>>": currentState = State.Pins; break; } break; case State.Format: UpdateFormat(ref fState, data); break; case State.Nails: UpdateNails(ref nState, data); break; case State.Pins: UpdatePins(ref pState, data); break; } }