예제 #1
0
파일: Program.cs 프로젝트: RoyChase/CSTherm
        static void Main(string[] args)
        {
            try
            {
                string currentPath = Assembly.GetExecutingAssembly().Location;
                currentPath = Path.GetDirectoryName(currentPath);

                WriteLog("Starting");

                //check that the output folder exists
                if (!Directory.Exists(Properties.Settings.Default.OutputFilePath))
                    Directory.CreateDirectory(Properties.Settings.Default.OutputFilePath);
                if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.CosmApiId) && !String.IsNullOrWhiteSpace(Properties.Settings.Default.CosmFeed))
                    account = new Cosm.Account(Properties.Settings.Default.CosmApiId, Properties.Settings.Default.CosmFeed);

                //load the sensors xml
                string settingPath = Path.Combine(currentPath, "Sensors.xml");

                WriteLog(String.Format("Loading settings from {0}", settingPath));

                sensors = Sensors.FromFile(settingPath);

                WriteLog("Settings loaded");

                if (System.Diagnostics.Debugger.IsAttached)
                {
                    Charting c = new Charting();
                    c.GetGraph(null, DateTime.Parse("2013-04-04 20:00"));

                    //Cosm c = new Cosm(account);
                    //c.Post("Ambient", DateTime.Now, 12.2);

                }

                TempReader tr = new TempReader();
                tr.Start();

                WriteLog("Reader started");

                HTTPComs coms = new HTTPComs();
                coms.Listen(new string[] { "http://+:8086/" });

                //Console.ReadLine();
                WriteLog("Stopping");

                tr.End();
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message);
            }
        }
예제 #2
0
        public void WriteTemp(string sensor, TempReader.Temp temp)
        {
            SensorConfig sensorConfig = Program.sensors.FindSensor(sensor);
            sensorConfig.CurrentTemp = temp.C;

            FileInfo logfile = new FileInfo(Path.Combine(Properties.Settings.Default.OutputFilePath, DateTime.Now.ToString("yyyyMMdd") + ".dat"));
            StreamWriter sw = new StreamWriter(logfile.Open(FileMode.Append, FileAccess.Write));
            sw.Write("{0}|{1}|{2}|{3:F3}|{4:F3}\r\n", DateTime.Now.ToString("HH:mm:ss"), sensor, sensorConfig.Name, temp.C, temp.F);
            sw.Flush();
            sw.Close();

            if (Program.account != null)
            {
                Cosm c = new Cosm(Program.account);
                c.Post(sensorConfig.Name, DateTime.Now, (double)temp.C);
            }
        }
예제 #3
0
파일: Chart.cs 프로젝트: RoyChase/CSTherm
        private Bitmap DrawGraph(DateTime from)
        {
            const int BMHEIGHT = 600;
            const int BMWIDTH = 800;
            const int CHARTLEFT = 90;
            const int CHARTBOTTOM = 50;
            const int CHARTTOP = BMHEIGHT - 10;
            const int CHARTHEIGHT = CHARTTOP - CHARTBOTTOM;
            const int WIDTH15 = (BMWIDTH - 50 - CHARTLEFT) / (4 * 24);
            const int CHARTRIGHT = CHARTLEFT + (4 * 24 * WIDTH15);

            int minTemp = 200;
            int maxTemp = 0;
            Color[] pencolours = { Color.Red, Color.Green, Color.Blue };

            TempReader tr = new TempReader();

            Dictionary<string, List<TempReader.Temp>> data = tr.ReadTempResults(from);

            //find the max and min temps for the sensors
            decimal maxC = Program.sensors.sensors.Max(e=> e.Settings != null ? e.Settings.Max(t => t.AveC) : 0);
            decimal minC = Program.sensors.sensors.Min(e => e.Settings != null ? e.Settings.Min(t => t.AveC) : 200);

            if (minC < minTemp) minTemp = (int)Math.Floor(minC);
            if (maxC > maxTemp) maxTemp = (int)Math.Ceiling(maxC);

            foreach (var s in data.Values)
            {
                var ssorted = s.OrderBy(t => t.C);
                int sMax = (int)Math.Ceiling(ssorted.Last().C);
                if (sMax > maxTemp) maxTemp = sMax;

                int sMin = (int)Math.Floor(ssorted.First().C);
                if (sMin < minTemp) minTemp = sMin;
            };

            maxTemp++;

            int pixelsPerDegree = CHARTHEIGHT / (maxTemp - minTemp - 1);

            Bitmap bm = new Bitmap(BMWIDTH, BMHEIGHT);
            Graphics g = Graphics.FromImage(bm);
            g.FillRectangle(Brushes.Beige, 0, 0, BMWIDTH, BMHEIGHT);

            Font font = new Font("Arial", 8, GraphicsUnit.Point);
            g.DrawString(DateTime.Now.ToString("HH:mm:ss"), font, Brushes.Black, 1, BMHEIGHT - 15);

            //write legend
            font = new Font("Arial", 10, GraphicsUnit.Point);
            Rectangle legend = new Rectangle(CHARTRIGHT + 10, 20, 80, 20);
            int series = 0;
            foreach (var s in data)
            {
                g.DrawString(s.Key, font, new SolidBrush(pencolours[series]), legend);
                legend.Offset(0, 20);
                series++;
            }

            g.TranslateTransform(0, BMHEIGHT);
            g.ScaleTransform(1, -1);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.AntiAlias;

            Matrix flipped = g.Transform;

            using (Pen p = new Pen(Color.Black, 2))
            {
                g.DrawLine(p, CHARTLEFT, CHARTBOTTOM, CHARTLEFT, CHARTTOP);
                g.DrawLine(p, CHARTLEFT, CHARTBOTTOM, CHARTRIGHT, CHARTBOTTOM);
            }

            // Create a StringFormat object with the each line of text, and the block
            // of text centered on the page.
            StringFormat stringFormat = new StringFormat();
            stringFormat.Alignment = StringAlignment.Center;
            stringFormat.LineAlignment = StringAlignment.Center;

            font = new Font("Arial", 10, GraphicsUnit.Point);

            using (Pen p = new Pen(Color.Gray, 1))
            {
                for (int temp = minTemp; temp < maxTemp; temp++)
                {
                    int yPos = ((temp - minTemp) * pixelsPerDegree) + CHARTBOTTOM;
                    if (yPos != CHARTBOTTOM)
                        g.DrawLine(p, CHARTLEFT, yPos, CHARTRIGHT, yPos);

                    //add text
                    int flippedYPos = BMHEIGHT - yPos - 5;

                    g.ResetTransform();
                    g.DrawString(temp.ToString(), font, Brushes.Black, (float)(CHARTLEFT - 40), (float)flippedYPos, System.Drawing.StringFormat.GenericDefault);
                    g.Transform = flipped;
                }

                // Draw the xaxis points
                TimeSpan ts = from.TimeOfDay;
                for (int time = 0; time < 25; time++)
                {
                    int xPos = ((time * 4) * WIDTH15) + CHARTLEFT;
                    if (xPos != CHARTLEFT)
                        g.DrawLine(p, xPos, CHARTBOTTOM, xPos, CHARTTOP);

                    //add text
                    if (time != 24)
                    {
                        string text = ts.Add(new TimeSpan(time, 0, 0)).ToString(@"hh\:mm");
                        Rectangle rect1 = new Rectangle(xPos - 25, BMHEIGHT - CHARTBOTTOM + 5, 50, (int)g.MeasureString(text, font).Height * 2 + 2);
                        stringFormat.LineAlignment = (time % 2) == 1 ? StringAlignment.Far : StringAlignment.Near;

                        g.ResetTransform();
                        g.DrawString(text, font, Brushes.Black, rect1, stringFormat);
                        g.Transform = flipped;
                    }
                }
            }

            int set = 0;
            foreach (var dr in data)
            {
                //TODO: read through sensors to set the max and min lines
                SensorConfig s = Program.sensors.FindSensorByName(dr.Key);
                if (s.Settings != null)
                {
                    maxC = s.Settings.Max(t => t.AveC);
                    minC = s.Settings.Min(t => t.AveC);

                    //draw the max and min lines
                    using (Pen p = new Pen(pencolours[set], 2))
                    {
                        p.DashStyle = DashStyle.Dash;
                        int y = (int)Math.Round((minC - minTemp) * pixelsPerDegree) + CHARTBOTTOM;
                        g.DrawLine(p, CHARTLEFT, y, CHARTRIGHT, y);

                        y = (int)Math.Round((maxC - minTemp) * pixelsPerDegree) + CHARTBOTTOM;
                        g.DrawLine(p, CHARTLEFT, y, CHARTRIGHT, y);
                    }
                }

                if (dr.Value.Count() > 1)
                {
                    List<Point> points = new List<System.Drawing.Point>();

                    foreach (var p in dr.Value)
                    {
                        int mins = (int)p.time.Subtract(from).TotalMinutes;
                        int xpos = (mins / 15) * WIDTH15 + CHARTLEFT;
                        points.Add(new Point(xpos, (int)Math.Round((p.C - minTemp) * pixelsPerDegree) + CHARTBOTTOM));
                    }
                    g.DrawLines(new System.Drawing.Pen(pencolours[set], 2), points.ToArray());
                }
                set++;
            }

            MemoryCache.Default.Add("graph", bm, new DateTimeOffset(DateTime.Now.AddMinutes(15)));
            return bm;
        }