public static void triangulatePosition(Node[] nodes) { //List<DateTime> date, List< Int32 > node, List<Int32> x, List< Int32 > y, List<Int32> senOne, List< Int32 > senTwo, List<Int32> senThree, List< Int32 > senFour, List<Int32> senFive, List< Int32 > senSix //////////////////////// /* TODO: -fix node degree accuracy - values were not returning correctly -find base voltages of sensors? average values that did not trip the sensor? - */ //////////////////////// bool isTripped = false; int length = nodes.Length; float[] nodeDegrees = new float[length]; float[] highSens = new float[length]; float[] secSens = new float[length]; float[] highSensIndex = new float[length]; float[] secSensIndex = new float[length]; float[] data; /* if (length == 1) { try { float degree = determineAngle(senOne[0], senTwo[0], senThree[0], senFour[0], senFive[0], senSix[0]); //Console.WriteLine("Data: " + degree); float[] tempArr = { senOne[0], senTwo[0], senThree[0], senFour[0], senFive[0], senSix[0] }; highSens[0] = tempArr.Max();//first highest sensor value if (highSens[0] > 1) { Console.WriteLine("Data: " + degree + " sensor val: " + senOne[0] + " " + senTwo[0] + " " + senThree[0] + " " + senFour[0] + " " + senFive[0] + " " + senSix[0]); } } catch { } } */ if (length >= 3) { //calculate degree of each node for (int i = 0; i < length; i++) { float[] tempArr = { nodes[i].SenOne, nodes[i].SenTwo, nodes[i].SenThr, nodes[i].SenFou, nodes[i].SenFiv, nodes[i].SenSix }; nodeDegrees[i] = determineAngle(nodes[i].SenOne, nodes[i].SenTwo, nodes[i].SenThr, nodes[i].SenFou, nodes[i].SenFiv, nodes[i].SenSix); highSens[i] = tempArr.Max();//first highest sensor value secSens[i] = (from num in tempArr orderby num descending select num).Skip(1).First();//second highest sensor value highSensIndex[i] = Array.IndexOf(tempArr, highSens[i]); secSensIndex[i] = Array.IndexOf(tempArr, secSens[i]); if (highSens[i] > 40) { isTripped = true; } else { float tempVal = 0; foreach (float element in tempArr) { tempVal += element; } switch (i) { case 0: avgSensVal1 = (avgSensVal1 + tempVal / 6) / 2; break; case 1: avgSensVal2 = (avgSensVal2 + tempVal / 6) / 2; break; case 2: avgSensVal3 = (avgSensVal3 + tempVal / 6) / 2; break; } } } if (isTripped) { data = triangulate((float)nodes[0].X, (float)nodes[1].X, (float)nodes[2].X, (float)nodes[0].Y, (float)nodes[1].Y, (float)nodes[2].Y, highSens[0], secSens[0], highSens[1], secSens[1], highSens[2], secSens[2], highSensIndex[0], secSensIndex[0], highSensIndex[1], secSensIndex[1], highSensIndex[2], secSensIndex[2], avgSensVal1, avgSensVal2, avgSensVal3); double[] position = new double[2]; position = convToLatLon(data[0], data[1]); //just for organizing the console a bit better if (wasTripped) { //Console.WriteLine(); wasTripped = false; } if (position[0].ToString() == "NaN" || position[0] != Double.NaN) { if (position[0] > 41 && position[0] < 43 && position[1] > -81 && position[1] < -79) { string tempString = position[0] + "," + position[1]; Tuple<string, DateTime, bool> tempData = Tuple.Create(tempString, DateTime.Now, false); //Console.WriteLine(tempString); PipeThread.data.Add(tempData); } } } else { wasTripped = true; //Console.Write("\rNo sensor tripped."); } /* data[0] = x_est; data[1] = y_est; data[2] = I1_SE; data[3] = I1_S; data[4] = I2_SE; data[5] = I2_S; data[6] = I3_SE; data[7] = I3_S; */ /* old code float[] slope = new float[length]; for (int i = 0; i < length; i++) { slope[i] = calcSlope(nodeDegrees[i], x[i], y[i]); } float[] interceptX = new float[length * length]; float[] interceptY = new float[length * length]; int tempLength = 0; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (i != j) { float _x; float _y; findIntercept(slope[i], slope[j], x[i], y[i], x[j], y[j], out _x, out _y); interceptX[tempLength] = _x; interceptY[tempLength] = _y; if (senOne[i] >= 150 || senTwo[i] >= 150 || senThree[i] >= 150 || senFour[i] >= 150 || senFive[i] >= 150 || senSix[i] >= 150) { //Console.WriteLine(i + " " + nodeDegrees[i]); } tempLength++; } } } float avgX; float avgY; avgPoints(interceptX, interceptY, out avgX, out avgY); for (int i = 0; i < length; i++) { if (senOne[i] >= 150 || senTwo[i] >= 150 || senThree[i] >= 150 || senFour[i] >= 150 || senFive[i] >= 150 || senSix[i] >= 150) { Console.WriteLine(avgX + " " + avgY); } } */ } else { //Console.Write("\rConnect more nodes to begin. "); } }
//split string first via ':', then split via space public static void parsePipeString(string _readLine) { bool dataIntact = true; string[] dataSplit = _readLine.Split(' '); try { if (dataSplit[0] == "Event") { //request audio for 1 minute interval 30 before 30 after //request sensor data for that time //"Event 1 |-32768 -> 32768| yyyy-MM-dd_HH-mm-ss.ffff" //int nodeNum = Convert.ToInt32(dataSplit[1]); //int amplitude = Math.Abs(Convert.ToInt32(dataSplit[2])); DateTime dt = DateTime.ParseExact(dataSplit[1], "yyyy-MM-dd_HH-mm-ss.ffff", CultureInfo.InvariantCulture); PipeThread.messages.Add("Request " + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss.ffff"), DateTime.Now); PipeThread.messages.Add("RequestAudio " + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss.ffff") + " " + 20.ToString(), DateTime.Now); Console.WriteLine("Added message: Event" + _readLine); } else if (dataSplit[0] == "Node") { if (!isInitialized) { nodes[0] = new Node(); nodes[1] = new Node(); nodes[2] = new Node(); } DateTime dateT; int nodeT, senOneT, senTwoT, senThreeT, senFourT, senFiveT, senSixT; double xT, yT; dateT = new DateTime(); nodeT = -1; senOneT = -1; senTwoT = -1; senThreeT = -1; senFourT = -1; senFiveT = -1; senSixT = -1; Int32.TryParse(dataSplit[1], out nodeT); double.TryParse(dataSplit[2], out xT); double.TryParse(dataSplit[3], out yT); Int32.TryParse(dataSplit[4], out senOneT); Int32.TryParse(dataSplit[5], out senTwoT); Int32.TryParse(dataSplit[6], out senThreeT); Int32.TryParse(dataSplit[7], out senFourT); Int32.TryParse(dataSplit[8], out senFiveT); Int32.TryParse(dataSplit[9], out senSixT); DateTime.TryParseExact(dataSplit[10], "yyyy-MM-dd_HH-mm-ss.ffff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateT); //Console.WriteLine(dataSplit[0] + " " + dataSplit[1] + " " + dataSplit[2] + " " + dataSplit[3] + " " + dataSplit[4]); //Console.WriteLine(dateT + " " + nodeT + " " + xT + " " + yT + " " + senOneT + " " + senTwoT + " " + senThreeT + " " + senFourT + " " + senFiveT + " " + senSixT); if (dateT == new DateTime()) { dataIntact = false; }; if (nodeT == -1) { dataIntact = false; }; if (xT == 0) { dataIntact = false; }; if (yT == 0) { dataIntact = false; }; if (senOneT == -1) { dataIntact = false; }; if (senTwoT == -1) { dataIntact = false; }; if (senThreeT == -1) { dataIntact = false; }; if (senFourT == -1) { dataIntact = false; }; if (senFiveT == -1) { dataIntact = false; }; if (senSixT == -1) { dataIntact = false; }; //create node object once triangulation code can be scaled i.e. assume infinite nodes if (nodeT > 3 || nodeT < 0) { dataIntact = false; } else { Console.WriteLine(xT + " " + yT); nodes[nodeT].Date = dateT; nodes[nodeT].NodeNumber = nodeT; nodes[nodeT].X = xT; nodes[nodeT].Y = yT; nodes[nodeT].SenOne = senOneT; nodes[nodeT].SenTwo = senTwoT; nodes[nodeT].SenThr = senThreeT; nodes[nodeT].SenFou = senFourT; nodes[nodeT].SenFiv = senFiveT; nodes[nodeT].SenSix = senSixT; nodes[nodeT].Iterator++; if (nodes[nodeT].Activated == false) { string tempString = "Node," + nodeT + "," + nodes[nodeT].X + "," + nodes[nodeT].Y; Tuple<string, DateTime, bool> tempData = Tuple.Create(tempString, DateTime.Now, false); //position = Calculation.convToLatLon(xT, yT); PipeThread.data.Add(tempData); //Console.WriteLine(tempString); nodes[nodeT].Activated = true; } } foreach (Node node in nodes) { if (node.Iterator > 50) { Console.WriteLine("Stagnated Data, check sensor connectivity"); } } if (dataIntact && nodes.Any(o => o.Activated == false)) { Calculation.triangulatePosition(nodes); foreach (Node node in nodes) { node.Iterator = 0; } } else { //PipeReadThread.data.Add("Data not intact."); } //read backwards, take only one value,kill rest /* if (senI1 > 0 && senI2 > 0 && senI3 > 0) { if (senI1 > 1) { int pres = 0; for (int i = node.ToArray().Length; i > 0; i--) { if (node[i - 1] == 0) { if (pres == 0) { pres++;//increment only } else { date.RemoveAt(i); node.RemoveAt(i); x.RemoveAt(i); y.RemoveAt(i); senOne.RemoveAt(i); senTwo.RemoveAt(i); senThree.RemoveAt(i); senFour.RemoveAt(i); senFive.RemoveAt(i); senSix.RemoveAt(i); } } } } if (senI2 > 1) { int pres = 0; for (int i = node.ToArray().Length; i > 0; i--) { if (node[i - 1] == 1) { if (pres == 0) { pres++;//increment only } else { date.RemoveAt(i); node.RemoveAt(i); x.RemoveAt(i); y.RemoveAt(i); senOne.RemoveAt(i); senTwo.RemoveAt(i); senThree.RemoveAt(i); senFour.RemoveAt(i); senFive.RemoveAt(i); senSix.RemoveAt(i); } } } } if (senI3 > 1) { int pres = 0; for (int i = node.ToArray().Length; i > 0; i--) { if (node[i - 1] == 2) { if (pres == 0) { pres++;//increment only } else { date.RemoveAt(i); node.RemoveAt(i); x.RemoveAt(i); y.RemoveAt(i); senOne.RemoveAt(i); senTwo.RemoveAt(i); senThree.RemoveAt(i); senFour.RemoveAt(i); senFive.RemoveAt(i); senSix.RemoveAt(i); } } } } Console.WriteLine(node.ToArray().Length); Calculation.triangulatePosition(date, node, x, y, senOne, senTwo, senThree, senFour, senFive, senSix); date.Clear(); node.Clear(); x.Clear(); y.Clear(); senOne.Clear(); senTwo.Clear(); senThree.Clear(); senFour.Clear(); senFive.Clear(); senSix.Clear(); sen1 = false; sen2 = false; sen3 = false; senI1 = 0; senI2 = 0; senI3 = 0; } */ } } catch (Exception exception) { Console.WriteLine("PipeParser: " + exception); } }