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; } }
private void UpdateNails(ref NailsState state, StringBuilder data) { switch (state) { case NailsState.Idle: { var str = BoardUtil.SplitLine(data, 1); switch (str[0].ToLowerInvariant()) { case "test": state = NailsState.Desc; break; case "nail": state = NailsState.NailEntry; break; } } break; case NailsState.Desc: //if (data.ToString().Contains("INCH units")) // InchUnits = true; state = NailsState.Idle; break; case NailsState.NailEntry: { var str = BoardUtil.SplitLine(data, 8); var nail = new Nail(); nail.Id = int.Parse(str[0].Substring(1)); var loc = new Vector2(); loc.X = ParseDouble(str[1]); loc.Y = ParseDouble(str[2]); nail.Location = loc; nail.Type = byte.Parse(str[3]); nail.Side = GetSide(str[5]); nail.Net = int.Parse(str[6].Substring(1)); nail.Name = str[7]; Nails.Add(nail); } break; } }