public void WriteAndCheckMeasurements(string measurement, List <MeasurementData> data) { if (data.Count <= 0) { return; } DateTime date = DateTime.Now; string folder = "data\\" + date.ToShortDateString(); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } Stream file; if (!File.Exists(folder + "\\" + measurement + ".bl")) { WriteMeasurements(measurement, data); return; } string fname, fnametmp; file = File.OpenRead(fname = folder + "\\" + measurement + ".bl"); Stream fileTmp = File.Create(fnametmp = folder + "\\" + measurement + ".tmp"); BinaryReader reader = new BinaryReader(file); BinaryWriter writer = new BinaryWriter(fileTmp); long count = (file.Length / (sizeof(long) + sizeof(double))); MeasurementData tmp; int j; bool write = true; for (long i = 0; i < count; i++) { write = true; tmp = new MeasurementData(reader); for (j = 0; j < data.Count; j++) { if (data[j].CreationTime == tmp.CreationTime) { write = false; break; } } if (write) { tmp.Write(writer); } } for (j = 0; j < data.Count; j++) { data[j].Write(writer); } file.Close(); fileTmp.Close(); File.Delete(fname); File.Move(fnametmp, fname); }
public void DataRead(BinaryReader reader) { byte cmd = 0; if (reader.BaseStream as MemoryStream != null) { if (((MemoryStream)reader.BaseStream).Length == 0) { return; } if (((MemoryStream)reader.BaseStream).Position >= ((MemoryStream)reader.BaseStream).Length - 1) { return; } } cmd = reader.ReadByte(); if (cmd != this.cmd) { reader.BaseStream.Seek(-1, SeekOrigin.Current); return; } double value = (double)reader.ReadInt16(); MeasurementData val = new MeasurementData(value); History.Add(val); if (History.Count > MaxSeriesPointsCount * 2) { History.RemoveRange(0, MaxSeriesPointsCount); server.Logger.WriteAndCheckMeasurements(Key, History); } if (OnDataReceived != null) { OnDataReceived(val); } if (AddPoint != null) { //Debug.Print("AddPoint {0} {1}", Name, Last); AddPoint(Last, Name); seriesPointsCount++; if (seriesPointsCount > MaxSeriesPointsCount && RemovePoint != null) { int d = seriesPointsCount - MaxSeriesPointsCount; for (int i = 0; i < d; i++) { //Debug.Print("RemovePoint {0} {1}", Name, i); RemovePoint(0, Name); } seriesPointsCount -= d; } } }
public void WriteMeasurement(string measurement, MeasurementData data) { DateTime date = DateTime.Now; if (!Directory.Exists("data\\" + date.ToShortDateString())) { Directory.CreateDirectory("data\\" + date.ToShortDateString()); } Stream file; if (!File.Exists("data\\" + date.ToShortDateString() + "\\" + measurement + ".bl")) { file = File.Create("data\\" + date.ToShortDateString() + "\\" + measurement + ".bl"); } else { file = File.Open("data\\" + date.ToShortDateString() + "\\" + measurement + ".bl", FileMode.Append); } BinaryWriter writer = new BinaryWriter(file); data.Write(writer); file.Close(); }
protected virtual void ClientStreamRead() { string header = readerS.ReadLine(); string tmp; string[] tmp2; string[] tmp3; if (header.ToUpper() == "ANDROID APP V0") { tmp = readerS.ReadLine().ToLower(); if (!tmp.StartsWith("commands-count:")) { writerS.Write("Protocol error. Need commands-count header first"); writerS.Flush(); return; } tmp2 = tmp.Split(':'); int cmdCount; if (!Int32.TryParse(tmp2[1].Trim(), out cmdCount)) { writerS.Write("Failed to get command count: Int32 parsing error\nArgument string:" + tmp + "\nError in [" + tmp2[1] + "]"); writerS.Flush(); return; } StringBuilder response = new StringBuilder(); for (int i = 0; i < cmdCount; i++) { tmp = readerS.ReadLine().ToLower(); tmp2 = tmp.Split(':'); switch (tmp2[0]) { case "get-last": #region GET LAST //temp/temperature/t|hum/humidity/h|illum/illumination/i|all response.Append("ger-last: "); tmp3 = tmp2[1].Split(','); bool temperature = false; bool humidity = false; bool illumination = false; string temp; foreach (string str in tmp3) { temp = str.Trim().ToLower(); if (temp == "t" || temp == "temp" || temp == "temperature") { temperature = true; } else if (temp == "i" || temp == "illum" || temp == "illumination") { illumination = true; } else if (temp == "h" || temp == "humidity" || temp == "hum") { humidity = true; } else if (temp == "all") { temperature = true; humidity = true; illumination = true; break; } } if (temperature) { MeasurementData lt = server.measurements["temperature"].Last; if (lt != null) { response.Append("temperature=" + lt.ToString() + ","); } } if (humidity) { MeasurementData lt = server.measurements["humidity"].Last; if (lt != null) { response.Append("humidity=" + lt.ToString() + ","); } } if (illumination) { MeasurementData lt = server.measurements["illumination"].Last; if (lt != null) { response.Append("illumination=" + lt.ToString() + ","); } } response.Append("\n"); #endregion break; case "refresh": #region REFRESH response.Append("refresh: complete\n"); tmp3 = tmp2[1].Split(','); temperature = false; humidity = false; illumination = false; foreach (string str in tmp3) { temp = str.Trim().ToLower(); if (temp == "t" || temp == "temp" || temp == "temperature") { temperature = true; } else if (temp == "i" || temp == "illum" || temp == "illumination") { illumination = true; } else if (temp == "h" || temp == "humidity" || temp == "hum") { humidity = true; } else if (temp == "all") { temperature = true; humidity = true; illumination = true; break; } } if (temperature) { server.measurements["temperature"].Refresh(); } if (humidity) { server.measurements["humidity"].Refresh(); } if (illumination) { server.measurements["illumination"].Refresh(); } #endregion break; case "get-list": #region GET LIST response.Append("get-list: "); tmp3 = tmp2[1].Split(','); temperature = false; humidity = false; illumination = false; int count = 10; int rcount = count; if (!Int32.TryParse(tmp3[0], out count)) { response.Append("get-list-error: Failed to parse Int32\nArgument: '" + tmp3[0] + "'"); } for (int j = 1; j < tmp3.Length; j++) { temp = tmp3[j].Trim().ToLower(); if (temp == "t" || temp == "temp" || temp == "temperature") { temperature = true; } else if (temp == "i" || temp == "illum" || temp == "illumination") { illumination = true; } else if (temp == "h" || temp == "humidity" || temp == "hum") { humidity = true; } else if (temp == "all") { temperature = true; humidity = true; illumination = true; break; } } if (temperature) { List <MeasurementData> hist = server.measurements["temperature"].History; rcount = count; if (hist.Count < count) { rcount = hist.Count; } response.Append("temperature{"); for (int j = hist.Count - 1; j >= hist.Count - rcount; j--) { response.Append(hist[j].ToString() + ";"); } response.Append("},"); } if (humidity) { List <MeasurementData> hist = server.measurements["humidity"].History; rcount = count; if (hist.Count < count) { rcount = hist.Count; } response.Append("humidity{"); for (int j = hist.Count - 1; j >= hist.Count - rcount; j--) { response.Append(hist[j].ToString() + ";"); } response.Append("},"); } if (illumination) { List <MeasurementData> hist = server.measurements["illumination"].History; rcount = count; if (hist.Count < count) { rcount = hist.Count; } response.Append("illumination{"); for (int j = hist.Count - 1; j >= hist.Count - rcount; j--) { response.Append(hist[j].ToString() + ";"); } response.Append("},"); } response.Append("\n"); #endregion break; case "set-timer": #region SET TIMER response.Append("set-timer: complete\n"); tmp3 = tmp2[1].Split(','); temperature = false; humidity = false; illumination = false; temp = tmp3[0].Trim().ToLower(); int interval = 10; if (!Int32.TryParse(tmp3[1], out interval)) { response.Append("set-timer-error: Failed to parse Int32\nArgument: '" + tmp3[1] + "'"); } if (temp == "t" || temp == "temp" || temp == "temperature") { temp = "temperature"; } else if (temp == "i" || temp == "illum" || temp == "illumination") { temp = "illumination"; } else if (temp == "h" || temp == "humidity" || temp == "hum") { temp = "humidity"; } else if (temp == "all") { if (interval == 0) { server.measurements["temperature"].StopMeasurementTimer(); server.measurements["humidity"].StopMeasurementTimer(); server.measurements["illumination"].StopMeasurementTimer(); } else { server.measurements["temperature"].StartMeasurementTimer(); server.measurements["temperature"].SetMeasurementInterval(interval); server.measurements["illumination"].StartMeasurementTimer(); server.measurements["illumination"].SetMeasurementInterval(interval); server.measurements["humidity"].StartMeasurementTimer(); server.measurements["humidity"].SetMeasurementInterval(interval); } break; } if (interval == 0) { server.measurements[temp].StopMeasurementTimer(); } else { server.measurements[temp].StartMeasurementTimer(); server.measurements[temp].SetMeasurementInterval(interval); } #endregion break; default: response.Append("Unknown header: '" + tmp2[0] + "'\n"); break; } } writerS.Write(response.ToString()); writerS.Flush(); } else { writerS.Write("Unexpected header. Please, wait for new version"); writerS.Flush(); } }