
// DynamicTimeSeries.java
// Andrew Davison, ad@coe.psu.ac.th, Nov 2022

/* A single line in a TimeSeries Chart, 
   with a new data point generated every second by a Timer
   that is added to a TimeSeries.

   The x-axis is restricted to one minute, and scolls to 
   the left as data is added. The y-axis is limited to 
   the range 0-200.

    Usage:
      > compile DynamicTimeSeries.java
      > run DynamicTimeSeries
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;

import org.jfree.data.time.*;
import org.jfree.data.xy.*;



public class DynamicTimeSeries extends JFrame
{
  private static int TIMER_PERIOD = 1000;   // 1 sec

  private Timer timer;
  private TimeSeries series;  // global for use by timer
  private double currValue = 100.0;  


  public DynamicTimeSeries()
  {
    super("Dynamic TimeSeries Demo");

    TimeSeriesCollection ds = createDataset();
    JFreeChart chart = createChart(ds);

    ChartPanel cp = new ChartPanel(chart);
    setContentPane(cp);

    // pack();
    setSize(800, 400);
    setResizable(false);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }  // DynamicTimeSeries()


  private TimeSeriesCollection createDataset()
  // a series that dynamically grows using a timer
  {
    series = new TimeSeries("Random TimeSeries Data");
    TimeSeriesCollection ds = new TimeSeriesCollection(series);

    timer = new Timer(TIMER_PERIOD, new ActionListener()  {
      public void actionPerformed(ActionEvent e)
      {
        double factor = 0.90 + (0.2 * Math.random());
        currValue = currValue * factor;
        Millisecond now = new Millisecond();
        System.out.println("Now = " + now.toString()); // for debugging
        series.add(new Millisecond(), currValue);
      }
    });
    timer.start();

    return ds;
  } /* createDataset */



  private JFreeChart createChart(TimeSeriesCollection ds)
  {
    JFreeChart chart = ChartFactory.createTimeSeriesChart(
             "Dynamic TimeSeries Demo","Time", "Value", ds);

    XYPlot plot = chart.getXYPlot();

    ValueAxis axis = plot.getDomainAxis();
    axis.setAutoRange(true);
    axis.setFixedAutoRange(60000.0);  // 60 seconds

    axis = plot.getRangeAxis();
    axis.setRange(0.0, 200.0);

    return chart;
  } /* createChart */


  // -----------------------------------

  public static void main(String[] args)
  {   new DynamicTimeSeries();  } 


}   // end of DynamicTimeSeries class
