Changeset 191

Show
Ignore:
Timestamp:
02/23/10 21:18:49 (2 years ago)
Author:
stefan
Message:

implemented feature #177: extend timeline automatically when reaching end of traning program

Location:
trunk
Files:
2 added
13 modified

Legend:

Unmodified
Added
Removed
  • trunk/CHANGELOG

    r190 r191  
    33 
    44//== 0.7.9 == 
     5 
     62010-02-23 
     7* [stefan]  * implemented feature #177: extend timeline automatically when reaching end of traning program 
    58 
    692010-02-20 
  • trunk/src/org/jergometer/diagram/BikeDiagram.java

    r182 r191  
    1212 */ 
    1313public class BikeDiagram { 
     14  public static void createLegend(Diagram diagram, boolean dest, boolean bright, long programLength) { 
     15    diagram.addVerticalMarker(programLength, Color.BLACK, new BasicStroke(), "End of program"); 
     16 
     17    createLegend(diagram, dest, bright); 
     18  } 
     19 
    1420  public static void createLegend(Diagram diagram, boolean dest, boolean bright) { 
    1521    String suffix = ""; 
  • trunk/src/org/jergometer/diagram/BikeProgramVisualizer.java

    r175 r191  
    1818  } 
    1919 
    20   public void visualize(BikeProgram bikeProgram, boolean bright) { 
     20  public void visualize(BikeProgram bikeProgram, boolean bright, long duration) { 
    2121    synchronized(diagram) { 
    2222      BikeProgramData data = bikeProgram.getProgramData(); 
    23       diagram.setTimeRange(new Diagram.Range(0,data.getDuration())); 
     23      duration = duration == -1 ? data.getDuration() : duration; 
     24 
     25      diagram.setTimeRange(new Diagram.Range(0, duration)); 
    2426      diagram.setTimeAxisType(Diagram.TimeAxisType.minute); 
    2527 
    2628      diagram.clearGraphs(); 
    27       BikeDiagram.createLegend(diagram, true, bright); 
     29      BikeDiagram.createLegend(diagram, true, bright, data.getDuration()); 
    2830 
    2931      BikeProgramData.Action lastAction = null; 
  • trunk/src/org/jergometer/diagram/BikeSessionVisualizer.java

    r175 r191  
    2121  } 
    2222 
    23   public void visualize(BikeSession bikeSession, boolean clearBefore) throws IOException { 
     23  public void visualize(BikeSession bikeSession, boolean clearBefore, boolean fullSessionLength) throws IOException { 
    2424    synchronized(diagram) { 
    2525      ArrayList<MiniDataRecord> miniDataRecords = bikeSession.getData(); 
    2626 
     27      int duration = fullSessionLength ? bikeSession.getStatsTotal().getDuration() : bikeSession.getProgramDuration(); 
     28 
    2729      if (clearBefore) { 
    28         diagram.setTimeRange(new Diagram.Range(0,bikeSession.getProgramDuration())); 
     30        diagram.setTimeRange(new Diagram.Range(0, duration)); 
    2931        diagram.setTimeAxisType(Diagram.TimeAxisType.minute); 
    3032        diagram.clearGraphs(); 
    3133      } 
    32       BikeDiagram.createLegend(diagram, false, false); 
     34      BikeDiagram.createLegend(diagram, false, false, bikeSession.getProgramDuration()); 
    3335 
    3436      int time = 0; 
    3537      for (MiniDataRecord miniDataRecord : miniDataRecords) { 
    3638        if (stopped) return; 
    37         if (time == bikeSession.getProgramDuration()) break; 
     39        if (time == duration) break; 
    3840 
    3941        diagram.addValue("pulse", time, miniDataRecord.getPulse()); 
  • trunk/src/org/jergometer/diagram/ProgressionVisualizer.java

    r175 r191  
    44import org.jergometer.model.BikeSession; 
    55import org.jergometer.model.MiniDataRecord; 
     6import org.jergometer.model.StatsRecord; 
    67 
    78import java.util.ArrayList; 
     
    4243        long time = bikeSession.getStartTime().getTime() - start; 
    4344        int programDuration = bikeSession.getProgramDuration(); 
    44         MiniDataRecord sum = bikeSession.getSum(); 
     45        StatsRecord sum = bikeSession.getStatsRegular(); 
    4546 
    46         if (bikeSession.getPulseCount() != 0) { 
    47           diagram.addValue("pulse", time, sum.getPulse()/bikeSession.getPulseCount()); 
     47        if (sum.getPulseCount() != 0) { 
     48          diagram.addValue("pulse", time, (int) (sum.getAveragePulse() + 0.5)); 
    4849        } 
    4950        if (programDuration != 0) { 
    50           diagram.addValue("pedalRPM", time, sum.getPedalRpm()/programDuration); 
    51           diagram.addValue("power", time, sum.getPower()/programDuration); 
    52           double performance = ((double) sum.getPower()/programDuration * sum.getPedalRpm()/programDuration / 60); 
    53           diagram.addValue("performance", time, (int) performance); 
     51          diagram.addValue("pedalRPM", time, (int) (sum.getAveragePedalRPM() + 0.5)); 
     52          diagram.addValue("power", time, (int) (sum.getAveragePower() + 0.5)); 
     53          double performance = (sum.getAveragePower() * sum.getAveragePedalRPM() / 60); 
     54          diagram.addValue("performance", time, (int) (performance + 0.5)); 
    5455        } 
    5556      } 
  • trunk/src/org/jergometer/gui/Diagram.java

    r181 r191  
    5353  private ArrayList<Graph>[] graphs = new ArrayList[] { new ArrayList<Graph>(), new ArrayList<Graph>() }; 
    5454  private HashMap<Object,Graph> key2Graph = new HashMap<Object, Graph>(); 
     55  private ArrayList<Marker> verticalMarkers = new ArrayList<Marker>(); 
    5556 
    5657  /** Background image. */ 
     
    146147 
    147148    redrawImage(); 
    148     repaint(); 
    149149  } 
    150150 
    151151  public void clearGraphs() { 
     152    verticalMarkers.clear(); 
     153 
    152154    for (ArrayList<Graph> graph : graphs) { 
    153155      graph.clear(); 
     
    156158 
    157159    redrawImage(); 
    158     repaint(); 
    159160  } 
    160161 
     
    191192  } 
    192193 
     194  public synchronized void addVerticalMarker(long time, Color color, Stroke stroke, String msg) { 
     195    verticalMarkers.add(new Marker(time, color, stroke, msg)); 
     196  } 
     197 
    193198  public void paint(Graphics g) { 
    194199    super.paint(g); 
     
    196201  } 
    197202 
    198   private void redrawImage() { 
     203  public void redrawImage() { 
    199204    Graphics2D g = backgroundImage.createGraphics(); 
    200205    int width = backgroundImage.getWidth(); 
     
    212217    // draw highlights 
    213218    drawHighlights(g); 
     219 
     220    // draw marker lines 
     221    drawVerticalMarkers(g); 
    214222 
    215223    // draw graph 
     
    227235    drawVerticalAxisMarkers(g, Side.left, true); 
    228236    drawTimeAxisMarkers(g, true); 
     237 
     238    repaint(); 
     239  } 
     240 
     241  private void drawVerticalMarkers(Graphics2D g) { 
     242    int height = backgroundImage.getHeight(); 
     243 
     244    Color oldColor = g.getColor(); 
     245    Stroke oldStroke = g.getStroke(); 
     246    for (Marker verticalMarker : verticalMarkers) { 
     247      if (verticalMarker.color != null) g.setColor(verticalMarker.color); 
     248      if (verticalMarker.stroke != null) g.setStroke(verticalMarker.stroke); 
     249      long x = verticalMarker.x; 
     250      g.draw(new Line2D.Float(getX(x), margin.top, getX(x), height - margin.bottom + crossSize)); 
     251    } 
     252    g.setColor(oldColor); 
     253    g.setStroke(oldStroke); 
    229254  } 
    230255 
     
    425450    backgroundImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
    426451    redrawImage(); 
    427     repaint(); 
    428452  } 
    429453 
     
    518542    } 
    519543  } 
     544 
     545  public static class Marker { 
     546    private long x; 
     547    public Color color; 
     548    public Stroke stroke; 
     549    private String msg; 
     550 
     551    public Marker(long x, Color color, Stroke stroke, String msg) { 
     552      this.x = x; 
     553      this.color = color; 
     554      this.stroke = stroke; 
     555      this.msg = msg; 
     556    } 
     557  } 
    520558} 
  • trunk/src/org/jergometer/gui/MainWindow.java

    r187 r191  
    5252  private JRadioButtonMenuItem diagramProgressionMenuItem; 
    5353  private JCheckBoxMenuItem showOnlyCompletedSessionsMenuItem; 
     54  private JCheckBoxMenuItem showFullSessionLength; 
    5455  private JMenu userMenu; 
    5556  private ButtonGroup userButtonGroup; 
     
    205206      showOnlyCompletedSessionsMenuItem.addActionListener(this); 
    206207      sessionsMenu.add(showOnlyCompletedSessionsMenuItem); 
     208      showFullSessionLength = new JCheckBoxMenuItem(I18n.getString("menu.sessions.show_full_length")); 
     209      showFullSessionLength.setMnemonic(I18n.getMnemonic("menu.sessions.show_full_length_mn")); 
     210      showFullSessionLength.setAccelerator(KeyStroke.getKeyStroke(I18n.getString("menu.sessions.show_full_length_ks"))); 
     211      showFullSessionLength.addActionListener(this); 
     212      sessionsMenu.add(showFullSessionLength); 
    207213      JMenuItem selectAllSessionsMenuItem = new JMenuItem(I18n.getString("menu.sessions.select_all")); 
    208214      selectAllSessionsMenuItem.setActionCommand(AC_SELECT_ALL_SESSIONS); 
     
    382388      jergometer.setSessionsVis(Jergometer.SessionsVis.progression); 
    383389    } else if (e.getSource() == showOnlyCompletedSessionsMenuItem) { 
    384       System.out.println(showOnlyCompletedSessionsMenuItem.isSelected()); 
    385390      jergometer.setShowOnlyCompletedSessions(showOnlyCompletedSessionsMenuItem.isSelected()); 
     391    } else if (e.getSource() == showFullSessionLength) { 
     392      jergometer.setShowFullSessionLength(showFullSessionLength.isSelected()); 
    386393    } else if (e.getActionCommand() == AC_SELECT_ALL_SESSIONS) { 
    387394      sessionTable.selectAll(); 
     
    448455              } catch (Exception e) { 
    449456                JOptionPane.showMessageDialog(mainWindow, I18n.getString("msg.could_not_open_file.please_configure_editor"), 
    450                   I18n.getString("msg.could_not_open_xml_editor"), JOptionPane.ERROR_MESSAGE); 
     457                    I18n.getString("msg.could_not_open_xml_editor"), JOptionPane.ERROR_MESSAGE); 
    451458                openSettingsWindow(); 
    452459              } 
     
    457464              } catch (IOException e) { 
    458465                JOptionPane.showMessageDialog(mainWindow, I18n.getString("msg.error_during_execution_of", command), 
    459                   I18n.getString("msg.could_not_open_xml_editor"), JOptionPane.ERROR_MESSAGE); 
     466                    I18n.getString("msg.could_not_open_xml_editor"), JOptionPane.ERROR_MESSAGE); 
    460467              } catch (InterruptedException ignored) { 
    461468              } 
     
    759766  } 
    760767 
     768  public void setShowFullSessionLength(boolean value) { 
     769    showFullSessionLength.setSelected(value); 
     770  } 
     771 
     772  public boolean isShowFullSessionLength() { 
     773    return showFullSessionLength.isSelected(); 
     774  } 
     775 
    761776  { 
    762777// GUI initializer generated by IntelliJ IDEA GUI Designer 
  • trunk/src/org/jergometer/Jergometer.java

    r187 r191  
    1616import javax.swing.*; 
    1717import java.awt.event.*; 
    18 import java.io.File; 
    1918import java.io.IOException; 
    2019import java.util.ArrayList; 
     
    140139 
    141140    switchToUser(jergometerSettings.getLastUserName()); 
     141 
     142    new JergometerConsole(this).start(); 
    142143 
    143144    Runtime.getRuntime().addShutdownHook(new Thread(){ 
     
    328329      Diagram diagram = mainWindow.getDiagram(); 
    329330//      diagram.clearGraphs(); 
    330       BikeDiagram.createLegend(diagram, false, false); 
     331      BikeDiagram.createLegend(diagram, false, false, program.getProgramData().getDuration()); 
    331332 
    332333      try { 
     
    408409    diagramVisualizer.stopVisualization(); 
    409410    filterSessions(); 
    410     visualizeBikeProgram(bikeProgram, bright); 
     411    visualizeBikeProgram(bikeProgram, bright, -1); 
    411412  } 
    412413 
     
    421422  } 
    422423 
    423   private void visualizeBikeProgram(BikeProgram bikeProgram, boolean bright) { 
     424  private void visualizeBikeProgram(BikeProgram bikeProgram, boolean bright, long duration) { 
    424425    BikeProgramVisualizer bikeProgramVisualizer = new BikeProgramVisualizer(mainWindow.getDiagram()); 
    425426    diagramVisualizer = bikeProgramVisualizer; 
    426     bikeProgramVisualizer.visualize(bikeProgram, bright); 
     427    bikeProgramVisualizer.visualize(bikeProgram, bright, duration); 
    427428  } 
    428429 
     
    463464    diagramVisualizer.stopVisualization(); 
    464465 
     466    int duration = mainWindow.isShowFullSessionLength() ? bikeSession.getStatsTotal().getDuration() : bikeSession.getProgramDuration(); 
     467 
    465468    // draw the program 
    466469    BikeProgram bikeProgram = programTree.getProgram(bikeSession.getProgramName()); 
    467470    boolean programFound = bikeProgram != null; 
    468471    if (programFound) { 
    469       visualizeBikeProgram(bikeProgram, true); 
     472      visualizeBikeProgram(bikeProgram, true, duration); 
    470473    } 
    471474 
     
    473476    BikeSessionVisualizer bikeSessionVisualizer = new BikeSessionVisualizer(mainWindow.getDiagram()); 
    474477    diagramVisualizer = bikeSessionVisualizer; 
    475     bikeSessionVisualizer.visualize(bikeSession, !programFound); 
     478    bikeSessionVisualizer.visualize(bikeSession, !programFound, mainWindow.isShowFullSessionLength()); 
    476479  } 
    477480 
     
    481484    switch (sessionsVis) { 
    482485      case average: 
     486        boolean fullLength = mainWindow.isShowFullSessionLength(); 
     487 
     488        // calculate minimal duration 
    483489        int duration = Integer.MAX_VALUE; 
    484490        for (BikeSession bikeSession : bikeSessions) { 
    485           duration = Math.min(duration,bikeSession.getProgramDuration()); 
     491          int thisDuration = fullLength ? bikeSession.getStatsTotal().getDuration() : bikeSession.getProgramDuration(); 
     492          duration = Math.min(duration, thisDuration); 
    486493        } 
    487494 
     
    545552  } 
    546553 
     554  public void setShowFullSessionLength(boolean value) { 
     555    mainWindow.setShowFullSessionLength(value); 
     556 
     557    if (selectedSessions.size() == 1) { 
     558      selectBikeSession(selectedSessions.get(0)); 
     559    } else 
     560    if (selectedSessions.size() > 1) { 
     561      selectBikeSessions(selectedSessions); 
     562    } 
     563  } 
     564 
     565  public BikeProgram getProgram() { 
     566    return program; 
     567  } 
     568 
    547569  public ArrayList<BikeSession> getSelectedBikeSessions() { 
    548570    return selectedSessions; 
     
    580602  public void bikeData(DataRecord data) { 
    581603    mainWindow.setData(data); 
    582     if (program.getSession().getDuration() < program.getSession().getProgramDuration()) { 
    583       mainWindow.getDiagram().addValue("pulse", program.getSession().getDuration(), data.getPulse()); 
    584       mainWindow.getDiagram().addValue("pedalRPM", program.getSession().getDuration(), data.getPedalRpm()); 
    585       mainWindow.getDiagram().addValue("power", program.getSession().getDuration(), data.getRealPower()); 
     604 
     605    Diagram diagram = mainWindow.getDiagram(); 
     606 
     607    // extends time range when we are at the end 
     608    if (program.getSession().getDuration() >= diagram.getTimeRange().max) { 
     609      long newMax = diagram.getTimeRange().max + (program.getProgramData().getDuration() / 2); 
     610      diagram.setTimeRange(new Diagram.Range(0, newMax)); 
     611      diagram.redrawImage(); 
     612    } 
     613 
     614    if (program.getSession().getDuration() < diagram.getTimeRange().max) { 
     615      int time = program.getSession().getDuration(); 
     616      diagram.addValue("pulse", time, data.getPulse()); 
     617      diagram.addValue("pedalRPM", time, data.getPedalRpm()); 
     618      diagram.addValue("power", time, data.getRealPower()); 
    586619    } 
    587620 
  • trunk/src/org/jergometer/model/BikeSession.java

    r189 r191  
    1414  private String programName; 
    1515  private int programDuration; 
    16   private int duration; 
    1716  private ArrayList<MiniDataRecord> data; 
    18   private MiniDataRecord sum = new MiniDataRecord(0, 0, 0); 
    19   private int pulseCount = 0; 
    20   private DataRecord lastRecord = new DataRecord(0,0,0,0,0,0,"",0); 
     17  private StatsRecord statsRegular = new StatsRecord(0, 0, 0, 0, 0); 
     18  private StatsRecord statsTotal = statsRegular; 
     19  private StatsRecord currentStats = statsRegular; 
     20  private DataRecord lastRecordRegular = new DataRecord(0,0,0,0,0,0,"",0); 
     21  private DataRecord lastRecordTotal = new DataRecord(0,0,0,0,0,0,"",0); 
    2122  private File file; 
    2223  private boolean onlyMiniInfo = false; 
     
    5354   * @param programName name of the program used for this session 
    5455   * @param programDuration duration of the program 
    55    * @param duration duration of this session 
    56    * @param sumPulse pulse sum 
    57    * @param sumPower power sum 
    58    * @param sumPedalRpm pedal RPM sum 
    59    * @param pulseCount number of totalized pulse values 
     56   * @param statsRegular statistics in the regular training time 
     57   * @param statsTotal statistics in the real total training time 
    6058   */ 
    6159  public BikeSession(String parentDir, Date startTime, String programName, int programDuration, 
    62                      int duration, int sumPulse, int sumPower, int sumPedalRpm, int pulseCount) { 
    63     this(new File(getFileName(parentDir, startTime)), startTime, programName, programDuration, duration, sumPulse, sumPower, sumPedalRpm, pulseCount); 
     60                     StatsRecord statsRegular, StatsRecord statsTotal) { 
     61    this(new File(getFileName(parentDir, startTime)), startTime, programName, programDuration, statsRegular, statsTotal); 
    6462  } 
    6563 
     
    7573   * @param programName name of the program used for this session 
    7674   * @param programDuration duration of the program 
    77    * @param duration duration of this session 
    78    * @param sumPulse pulse sum 
    79    * @param sumPower power sum 
    80    * @param sumPedalRpm pedal RPM sum 
    81    * @param pulseCount number of totalized pulse values 
     75   * @param statsRegular statistics in the regular training time 
     76   * @param statsTotal statistics in the real total training time 
    8277   */ 
    8378  public BikeSession(File file, Date startTime, String programName, int programDuration, 
    84                      int duration, int sumPulse, int sumPower, int sumPedalRpm, int pulseCount) { 
     79                     StatsRecord statsRegular, StatsRecord statsTotal) { 
    8580    this.onlyMiniInfo = true; 
    8681    this.file = file; 
    8782    this.startTime = startTime; 
    8883    this.programName = programName; 
    89     this.duration = duration; 
    9084    this.programDuration = programDuration; 
    91     this.sum = new MiniDataRecord(sumPulse, sumPower, sumPedalRpm); 
    92     this.pulseCount = pulseCount; 
     85    this.statsRegular = statsRegular; 
     86    this.statsTotal = statsTotal; 
    9387  } 
    9488 
    9589  public void initialVirtualBikeSession() { 
    9690    data = new ArrayList<MiniDataRecord>(); 
    97     duration = programDuration; 
     91    statsTotal.duration = programDuration; 
    9892  } 
    9993 
    10094  public boolean update(DataRecord record) { 
    101     if(!record.time.equals(lastRecord.time)) { 
     95    if(!record.time.equals(lastRecordRegular.time)) { 
    10296      // ergometer is not paused -> add the data record to my list 
    10397      data.add(new MiniDataRecord(record.pulse, record.realPower, record.pedalRpm)); 
    104       duration++; 
     98 
    10599      // update statistics 
    106       if (data.size() < programDuration) { 
    107         if (record.pulse > 0) { 
    108           pulseCount++; 
    109           sum.pulse += record.pulse; 
    110         } 
    111         sum.power += record.realPower; 
    112         sum.pedalRpm += record.pedalRpm; 
    113       } 
    114       lastRecord = record; 
     100      currentStats.duration++; 
     101      if (record.pulse > 0) { 
     102        currentStats.pulseCount++; 
     103        currentStats.pulseSum += record.pulse; 
     104      } 
     105      currentStats.powerSum += record.realPower; 
     106      currentStats.pedalRpmSum += record.pedalRpm; 
     107 
     108      if (currentStats == statsRegular) { 
     109        lastRecordRegular = record; 
     110      } 
     111      lastRecordTotal = record; 
     112       
     113      // switch from regular to total stats end of program reached 
     114      if (currentStats.duration == programDuration) { 
     115        statsTotal = statsRegular.clone(); 
     116        currentStats = statsTotal; 
     117      } 
    115118 
    116119      return true; 
     
    121124 
    122125  public void recalculateMiniInfo() { 
    123     sum = new MiniDataRecord(0, 0, 0); 
    124     pulseCount = 0; 
    125     for (int i = 0; i < duration && i < programDuration; i++) { 
     126    currentStats = null; 
     127    int size = data.size(); 
     128 
     129    statsRegular = new StatsRecord(0, 0, 0, 0, 0); 
     130    for (int i = 0; i < size && i < programDuration; i++) { 
    126131      MiniDataRecord record = data.get(i); 
     132 
     133      statsRegular.duration++; 
    127134      if (record.pulse > 0) { 
    128         pulseCount++; 
    129         sum.pulse += record.pulse; 
    130       } 
    131       sum.power += record.power; 
    132       sum.pedalRpm += record.pedalRpm; 
    133     } 
     135        statsRegular.pulseCount++; 
     136        statsRegular.pulseSum += record.pulse; 
     137      } 
     138      statsRegular.powerSum += record.power; 
     139      statsRegular.pedalRpmSum += record.pedalRpm; 
     140    } 
     141 
     142    statsTotal = statsRegular.clone(); 
     143    for (int i = statsRegular.duration; i < size; i++) { 
     144      MiniDataRecord record = data.get(i); 
     145 
     146      statsTotal.duration++; 
     147      if (record.pulse > 0) { 
     148        statsTotal.pulseCount++; 
     149        statsTotal.pulseSum += record.pulse; 
     150      } 
     151      statsTotal.powerSum += record.power; 
     152      statsTotal.pedalRpmSum += record.pedalRpm; 
     153    } 
     154 
    134155    needToBeSaved = true; 
    135156  } 
     
    142163 
    143164    toStream(out); 
    144  
    145165    out.close(); 
    146166 
     
    150170  private void toStream(DataOutputStream out) throws IOException { 
    151171    out.writeUTF("jergometer session"); 
    152     out.writeUTF("2"); 
     172    out.writeUTF("3"); 
    153173    out.writeLong(startTime.getTime()); 
    154174    out.writeUTF(programName); 
    155     sum.toStream(out); 
    156     out.writeInt(pulseCount); 
    157     lastRecord.toStream(out); 
    158175    out.writeInt(programDuration); 
     176    lastRecordRegular.toStream(out); 
     177    lastRecordTotal.toStream(out); 
     178    statsRegular.toStream(out); 
     179    statsTotal.toStream(out); 
    159180    out.writeInt(data.size()); 
    160181    for (MiniDataRecord miniDataRecord : data) { 
     
    167188    if (type.equals("jergometer session")) { 
    168189      int format = Integer.parseInt(in.readUTF()); 
    169       startTime = new Time(in.readLong()); 
    170       programName = in.readUTF(); 
    171       sum = new MiniDataRecord(in); 
    172       pulseCount = in.readInt(); 
    173       lastRecord = new DataRecord(in); 
    174       if (format >= 2) { 
     190 
     191      if (format <= 2) { 
     192        startTime = new Time(in.readLong()); 
     193        programName = in.readUTF(); 
     194        MiniDataRecord regularSum = new MiniDataRecord(in); 
     195        int pulseCount = in.readInt(); 
     196        lastRecordRegular = new DataRecord(in); 
     197        if (format >= 2) { 
     198          programDuration = in.readInt(); 
     199        } 
     200        int duration = in.readInt(); 
     201        data = new ArrayList<MiniDataRecord>(duration); 
     202        for (int i = 0; i < duration; i++) { 
     203          data.add(new MiniDataRecord(in)); 
     204        } 
     205        statsRegular = new StatsRecord(regularSum.getPulse(), regularSum.getPower(), regularSum.getPedalRpm(), duration, pulseCount); 
     206        statsTotal = statsRegular; 
     207        currentStats = null; 
     208      } else 
     209      if (format == 3) { 
     210        startTime = new Time(in.readLong()); 
     211        programName = in.readUTF(); 
    175212        programDuration = in.readInt(); 
    176       } 
    177       duration = in.readInt(); 
    178       data = new ArrayList<MiniDataRecord>(duration); 
    179       for (int i = 0; i < duration; i++) { 
    180         data.add(new MiniDataRecord(in)); 
     213        lastRecordRegular = new DataRecord(in); 
     214        lastRecordTotal = new DataRecord(in); 
     215        statsRegular = new StatsRecord(in); 
     216        statsTotal = new StatsRecord(in); 
     217        int size = in.readInt(); 
     218        data = new ArrayList<MiniDataRecord>(size); 
     219        for (int i = 0; i < size; i++) { 
     220          data.add(new MiniDataRecord(in)); 
     221        } 
    181222      } 
    182223    } 
     
    203244 
    204245  public int getDuration() { 
    205     return duration; 
     246    return statsTotal.duration; 
    206247  } 
    207248 
     
    211252  } 
    212253 
    213   public MiniDataRecord getSum() { 
    214     return sum; 
    215   } 
    216  
    217   public DataRecord getLastRecord() throws IOException { 
     254  public StatsRecord getStatsRegular() { 
     255    return statsRegular; 
     256  } 
     257 
     258  public StatsRecord getStatsTotal() { 
     259    return statsTotal; 
     260  } 
     261 
     262  public DataRecord getLastRecordRegular() throws IOException { 
    218263    loadFull(); 
    219     return lastRecord; 
     264    return lastRecordRegular; 
    220265  } 
    221266 
    222267  public String getProgramName() { 
    223268    return programName; 
    224   } 
    225  
    226   public double getAveragePulse() { 
    227     return (double) sum.getPulse()/pulseCount; 
    228   } 
    229  
    230   public double getAveragePower() { 
    231     return (double) sum.getPower()/duration; 
    232   } 
    233  
    234   public double getAveragePedalRPM() { 
    235     return (double) sum.getPedalRpm()/duration; 
    236   } 
    237  
    238   public int getPulseCount() { 
    239     return pulseCount; 
    240269  } 
    241270 
     
    255284 
    256285  public boolean isCompleted() { 
    257     return duration >= programDuration; 
     286    return statsTotal.duration >= programDuration; 
    258287  } 
    259288 
  • trunk/src/org/jergometer/model/SessionTableModel.java

    r76 r191  
    2929      case 0: return String.format("%1$td.%1$tm.%1$ty %1$tH:%1$tM", bikeSession.getStartTime()); 
    3030      case 1: return bikeSession.getProgramName(); 
    31       case 2: return String.format("%.1f", bikeSession.getAveragePulse()); 
    32       case 3: return String.format("%.1f", bikeSession.getAveragePower()); 
     31      case 2: return String.format("%.1f", bikeSession.getStatsRegular().getAveragePulse()); 
     32      case 3: return String.format("%.1f", bikeSession.getStatsRegular().getAveragePower()); 
    3333      case 4: 
    3434        int duration = Math.min(bikeSession.getDuration(), bikeSession.getProgramDuration()); 
  • trunk/src/org/jergometer/model/UserData.java

    r76 r191  
    8080            } 
    8181          } 
    82           int duration = Integer.parseInt(sessionXml.getAttribute("duration")); 
    83           int sumPulse = Integer.parseInt(sessionXml.getAttribute("sumPulse")); 
    84           int sumPower = Integer.parseInt(sessionXml.getAttribute("sumPower")); 
    85           int sumPedalRpm = Integer.parseInt(sessionXml.getAttribute("sumPedalRpm")); 
    86           int pulseCount = Integer.parseInt(sessionXml.getAttribute("pulseCount")); 
     82 
     83          StatsRecord statsRegular, statsTotal; 
     84          XMLElement statsRegularXml = sessionXml.getChildElement("statsRegular"); 
     85          if (statsRegularXml != null) { 
     86            statsRegular = new StatsRecord(statsRegularXml); 
     87          } else { 
     88            int duration = Integer.parseInt(sessionXml.getAttribute("duration")); 
     89            int sumPulse = Integer.parseInt(sessionXml.getAttribute("sumPulse")); 
     90            int sumPower = Integer.parseInt(sessionXml.getAttribute("sumPower")); 
     91            int sumPedalRpm = Integer.parseInt(sessionXml.getAttribute("sumPedalRpm")); 
     92            int pulseCount = Integer.parseInt(sessionXml.getAttribute("pulseCount")); 
     93            statsRegular = new StatsRecord(sumPulse, sumPower, sumPedalRpm, duration, pulseCount); 
     94          } 
     95 
     96          XMLElement statsTotalXml = sessionXml.getChildElement("statsTotal"); 
     97          if (statsTotalXml != null) { 
     98            statsTotal = new StatsRecord(statsTotalXml); 
     99          } else { 
     100            statsTotal = statsRegular; 
     101          } 
    87102 
    88103          sessions.add(new BikeSession(sessionsDirName, new Date(time), programName, programduration, 
    89               duration, sumPulse, sumPower, sumPedalRpm, pulseCount)); 
     104              statsRegular, statsTotal)); 
    90105        } 
    91106 
    92       } catch (Exception e) { 
     107      } catch (Exception ignored) { 
    93108      } 
    94109    } else { 
     
    119134  public void save() { 
    120135    XMLElement root = new XMLElement("sessions"); 
    121     root.setAttribute("version", "2"); 
     136    root.setAttribute("version", "3"); 
    122137 
    123138    { 
     
    130145        sessionXml.setAttribute("programName", "" + session.getProgramName()); 
    131146        sessionXml.setAttribute("programDuration", "" + session.getProgramDuration()); 
    132         sessionXml.setAttribute("duration", "" + session.getDuration()); 
    133         sessionXml.setAttribute("sumPulse", "" + session.getSum().getPulse()); 
    134         sessionXml.setAttribute("sumPower", "" + session.getSum().getPower()); 
    135         sessionXml.setAttribute("sumPedalRpm", "" + session.getSum().getPedalRpm()); 
    136         sessionXml.setAttribute("pulseCount", "" + session.getPulseCount()); 
     147        sessionXml.addChildElement(session.getStatsRegular().toXml("statsRegular")); 
     148        sessionXml.addChildElement(session.getStatsTotal().toXml("statsTotal")); 
    137149 
    138150        sessionsXml.addChildElement(sessionXml); 
     
    152164      writer.write(doc.toString()); 
    153165      writer.close(); 
    154     } catch (IOException e) { 
     166    } catch (IOException ignored) { 
    155167    } 
    156168  } 
  • trunk/src/org/jergometer/translation/jergometer_de.properties

    r182 r191  
    4444menu.sessions.show_only_completed_mn=v 
    4545menu.sessions.show_only_completed_ks=control M 
     46menu.sessions.show_full_length=Zeige volle Länge 
     47menu.sessions.show_full_length_mn=L 
     48menu.sessions.show_full_length_ks=control L 
    4649menu.sessions.select_all=Alle selektieren 
    4750menu.sessions.select_all_mn=A 
  • trunk/src/org/jergometer/translation/jergometer.properties

    r182 r191  
    4444menu.sessions.show_only_completed_mn=c 
    4545menu.sessions.show_only_completed_ks=control M 
     46menu.sessions.show_full_length=Show full length 
     47menu.sessions.show_full_length_mn=l 
     48menu.sessions.show_full_length_ks=control L 
    4649menu.sessions.select_all=Select all 
    4750menu.sessions.select_all_mn=A