Sammoa-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
September 2012
- 4 participants
- 111 discussions
r521 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio
by bpoussin@users.forge.codelutin.com 04 Sep '12
by bpoussin@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: bpoussin
Date: 2012-09-05 01:44:49 +0200 (Wed, 05 Sep 2012)
New Revision: 521
Url: http://forge.codelutin.com/repositories/revision/sammoa/521
Log:
Composant de lecture audio et fenetre de test de l'audio
Pas de compression (speex ou flac ne fonctionne pas pour l'instant :()
ps: vraiment pas la bonne place, mais je prefere commit et
laisser florian le deplacer la ou il faut.
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioTest.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SoundPlayer.java
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioTest.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioTest.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioTest.java 2012-09-04 23:44:49 UTC (rev 521)
@@ -0,0 +1,330 @@
+package fr.ulr.sammoa.application.device.audio;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import javax.media.CannotRealizeException;
+import javax.media.NoPlayerException;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Petite application de test de l'audio. Elle permet de choisir differente
+ * configuration audio. De faire des enregistrements et de relire le fichier
+ * enregistre.
+ * <p>
+ * La configuration choisi est inscrite et permet de la copier dans le fichier
+ * de configuration
+ * <p>
+ * Si la machine ne supporte pas deux enregistrement simultane, delay est mis
+ * a 0.
+ *
+ * Created: 27 aout 2012
+ *
+ * @author Benjamin POUSSIN <poussin(a)codelutin.com>
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class AudioTest extends JFrame {
+
+ private static final Logger logger = LoggerFactory.getLogger(AudioTest.class);
+
+ protected SammoaAudioRecorder recorder;
+ /** delay par defaut de chevauchement d'enregistrement */
+ protected int delay = 0;
+
+ protected JTextField filenameField = new JTextField("/tmp/junkk.wav");
+ protected JTextArea informationArea = new JTextArea();
+
+ protected JButton captureBtn = new JButton("Capture");
+ protected JButton stopBtn = new JButton("Stop");
+ protected JButton loadBtn = new JButton("Load");
+ protected SoundPlayer playerPanel = new SoundPlayer();
+
+ protected JPanel btnPanelSampleRate = new JPanel();
+ protected ButtonGroup btnGroupSampleRate = new ButtonGroup();
+ JRadioButton[] btnSampleRate = new JRadioButton[]{
+ new JRadioButton("8000",true),
+ new JRadioButton("11025"),
+ new JRadioButton("16000"),
+ new JRadioButton("22050"),
+ new JRadioButton("44100")
+ };
+
+ protected JPanel btnPanelSampleSizeInBits = new JPanel();
+ protected ButtonGroup btnGroupSampleSizeInBits = new ButtonGroup();
+ JRadioButton[] btnSampleSizeInBits = new JRadioButton[]{
+ new JRadioButton("8"),
+ new JRadioButton("16",true)
+ };
+
+ public AudioTest(){//constructor
+ initUI();
+ testMultiRecord();
+ }
+
+ protected void initUI () {
+ Box buttons = Box.createHorizontalBox();
+ buttons.add(captureBtn);
+ buttons.add(stopBtn);
+
+ Box box = Box.createVerticalBox();
+ box.add(filenameField);
+ box.add(buttons);
+
+ for (JRadioButton b : btnSampleRate) {
+ //Include the radio buttons in a group
+ btnGroupSampleRate.add(b);
+ //Add the radio buttons to the JPanel
+ btnPanelSampleRate.add(b);
+ b.addActionListener(
+ new ActionListener(){
+ public void actionPerformed(
+ ActionEvent e){
+ updateConfigInfo();
+ }
+ });
+ }
+
+ //Put the JPanel in the JFrame
+ box.add(btnPanelSampleRate);
+
+ for (JRadioButton b : btnSampleSizeInBits) {
+ //Include the radio buttons in a group
+ btnGroupSampleSizeInBits.add(b);
+ //Add the radio buttons to the JPanel
+ btnPanelSampleSizeInBits.add(b);
+ b.addActionListener(
+ new ActionListener(){
+ public void actionPerformed(
+ ActionEvent e){
+ updateConfigInfo();
+ }
+ });
+ }
+
+ //Put the JPanel in the JFrame
+ box.add(btnPanelSampleSizeInBits);
+
+ informationArea.setBorder(BorderFactory.createRaisedBevelBorder());
+ informationArea.setLineWrap(true);
+ box.add(informationArea);
+ box.add(loadBtn);
+ box.add(playerPanel);
+
+ //Finish the GUI and make visible
+ setTitle("Sound Test");
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
+ getContentPane().add(box, "Center");
+ pack();
+ setVisible(true);
+
+ captureBtn.setEnabled(true);
+ stopBtn.setEnabled(false);
+
+ // ADD LISTENER
+
+ //Register anonymous listeners
+ captureBtn.addActionListener(
+ new ActionListener(){
+ public void actionPerformed(
+ ActionEvent e){
+ captureBtn.setEnabled(false);
+ stopBtn.setEnabled(true);
+ captureAudio();
+ }
+ });
+
+ stopBtn.addActionListener(
+ new ActionListener(){
+ public void actionPerformed(
+ ActionEvent e){
+ captureBtn.setEnabled(true);
+ stopBtn.setEnabled(false);
+ recorder.stop();
+ }
+ });
+
+ loadBtn.addActionListener(
+ new ActionListener(){
+ public void actionPerformed(
+ ActionEvent e){
+ File file = new File(filenameField.getText());
+ playerPanel.loadFile(file);
+ }
+ });
+ }
+
+ protected void captureAudio(){
+ try{
+ File file = new File(filenameField.getText());
+ recorder = new SammoaAudioRecorder(getSampleRate(), getSampleSizeInBits(), 0);
+ recorder.record(file, true);
+ }catch (Exception eee) {
+ logger.error("Can't capture audio", eee);
+ }
+ }
+
+ protected float getSampleRate() {
+ float result = 44100;
+ for (JRadioButton b : btnSampleRate) {
+ if (b.isSelected()) {
+ result = Float.parseFloat(b.getText());
+ }
+ }
+ return result;
+ }
+
+ protected int getSampleSizeInBits() {
+ int result = 44100;
+ for (JRadioButton b : btnSampleSizeInBits) {
+ if (b.isSelected()) {
+ result = Integer.parseInt(b.getText());
+ }
+ }
+ return result;
+ }
+
+ protected void updateConfigInfo() {
+ informationArea.setText(String.format(
+ "sammoa.audio.recordDelayInSeconds=%s\n"
+ + "sammoa.audio.sampleRate=%s\n"
+ + "sammoa.audio.sampleSizeInBits=%s\n",
+ delay, getSampleRate(), getSampleSizeInBits()));
+ }
+
+ protected void testMultiRecord() {
+ try {
+ File f1 = File.createTempFile("sammoa-test-", ".wav");
+ f1.deleteOnExit();
+ File f2 = File.createTempFile("sammoa-test-", ".wav");
+ f2.deleteOnExit();
+
+ SammoaAudioRecorder r1 = new SammoaAudioRecorder(8000, 16, 2);
+ r1.record(f1, true);
+
+ SammoaAudioRecorder r2 = new SammoaAudioRecorder(8000, 16, 2);
+ r2.record(f2, true);
+
+ r2.stop();
+ r1.stop();
+ delay = 5;
+ } catch(Exception eee) {
+ logger.error("Can't record multiple file in same time", eee);
+ delay = 0;
+ }
+ updateConfigInfo();
+ }
+
+
+ public static void main( String args[])
+ throws LineUnavailableException, UnsupportedAudioFileException, IOException, NoPlayerException, CannotRealizeException{
+ new AudioTest();
+
+// float sampleRate = 8000; // 8000,11025,16000,22050,44100
+// int sampleSizeInBits = 16; // 8,16
+//
+// int channels = 1; // 1,2
+// boolean signed = true; //true,false
+// boolean bigEndian = false; //true,false
+//
+// AudioFormat audioFormat = new AudioFormat(
+// sampleRate,
+// sampleSizeInBits,
+// channels,
+// signed,
+// bigEndian);
+//
+// DataLine.Info dataLineInfo = new DataLine.Info(
+// TargetDataLine.class, audioFormat);
+// {
+// TargetDataLine l1 = (TargetDataLine)AudioSystem.getLine(dataLineInfo);
+// System.out.println("Line: " + l1);
+// System.out.println("Line: " + l1.getLineInfo());
+// l1.open(audioFormat);
+// l1.start();
+//
+// TargetDataLine l2 = (TargetDataLine)AudioSystem.getLine(dataLineInfo);
+// System.out.println("Line: " + l2);
+// System.out.println("Line: " + l2.getLineInfo());
+// l2.open(audioFormat);
+// l1.start();
+// }
+// {
+// AudioFileFormat aff = AudioSystem.getAudioFileFormat(new File("/tmp/junkk.wav"));
+// System.out.println("File: "+ aff.toString());
+// AudioInputStream sourceAis = AudioSystem.getAudioInputStream(new File("/tmp/junkk.wav"));
+//
+// DataLine.Info clipInfo = new DataLine.Info(Clip.class, audioFormat);
+// Clip clip = (Clip)AudioSystem.getLine(clipInfo);
+//
+// AudioInputStream ais = AudioSystem.getAudioInputStream(audioFormat, sourceAis);
+//// clip.open(ais);
+//// clip.start();
+// }
+// {
+// File f = new File("/tmp/junkk.wav");
+// Player p = Manager.createRealizedPlayer(f.toURI().toURL());
+// p.start();
+//// p.set
+// }
+//
+// System.out.println("#############################################");
+// Line.Info[] sources = AudioSystem.getSourceLineInfo(new Line.Info(SourceDataLine.class));
+// Line.Info[] target = AudioSystem.getTargetLineInfo(new Line.Info(TargetDataLine.class));
+//
+// System.out.println("AudioFileTypes:" + Arrays.toString(AudioSystem.getAudioFileTypes()));
+//
+// System.out.println("mixer:" + Arrays.toString(AudioSystem.getMixerInfo()));
+// for(Mixer.Info i : AudioSystem.getMixerInfo()) {
+// Mixer mixer = AudioSystem.getMixer(i);
+// System.out.println("-----");
+// System.out.println("mixer:" + mixer + "("+mixer.isLineSupported(Port.Info.MICROPHONE)+")");
+// try {
+// mixer.open();
+// } catch (LineUnavailableException eee) {
+// System.out.println("Can't open mixer");
+// }
+// System.out.println("mixer:" + mixer + "("+mixer.isLineSupported(Port.Info.MICROPHONE)+")");
+//
+// System.out.println("mixer info: " + mixer.getLineInfo());
+// System.out.println("max line: " + mixer.getMaxLines(mixer.getLineInfo()));
+//
+// for (Line.Info li : mixer.getSourceLineInfo()) {
+// System.out.println("s line info: " + li + "("+mixer.getMaxLines(li)+")");
+// System.out.println("s line info: " + li.getLineClass());
+// }
+//
+// for (Line.Info li : mixer.getTargetLineInfo()) {
+// System.out.println("t line info: " + li + "("+mixer.getMaxLines(li)+")");
+// System.out.println("t line info: " + li.getLineClass());
+// }
+//
+// for (Line l : mixer.getSourceLines()) {
+// System.out.println("s line: " + l);
+// System.out.println("s line info: " + l.getLineInfo());
+// }
+// for (Line l : mixer.getTargetLines()) {
+// System.out.println("t line: " + l);
+// System.out.println("t line info: " + l.getLineInfo());
+// }
+// }
+// System.out.println("sources: " + Arrays.toString(sources));
+// System.out.println("target: " + Arrays.toString(target));
+
+ }
+}
\ No newline at end of file
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SoundPlayer.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SoundPlayer.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SoundPlayer.java 2012-09-04 23:44:49 UTC (rev 521)
@@ -0,0 +1,225 @@
+package fr.ulr.sammoa.application.device.audio;
+
+import fr.ulr.sammoa.application.device.DeviceState;
+import fr.ulr.sammoa.application.device.DeviceStateEvent;
+import fr.ulr.sammoa.application.device.DeviceStateListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * Composant qui permet de charge un fichier audio et de le jouer. On peut se
+ * placer ou l'on veut dans le fichier audio.
+ *
+ * usage:
+ * <li> SoundPlayer sp = new SoundPlayer();
+ * <li> panel.add(sp);
+ * <li> sp.load(myFileWav);
+ *
+ * Created: 03 septembre 2012
+ *
+ * @author Benjamin POUSSIN <poussin(a)codelutin.com>
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class SoundPlayer extends JComponent implements DeviceStateListener {
+ protected SammoaAudioReader reader;
+ protected boolean playing = false; // whether the sound is currently playing
+
+ // The following fields are for the GUI
+ protected JButton play; // The Play/Stop button
+ protected JSlider progress; // Shows and sets current position in sound
+ protected JLabel time; // Displays audioPosition as a number
+ protected JLabel maxTime;
+
+ // Create a SoundPlayer component for the specified file.
+ public SoundPlayer() {
+ initUI();
+ initAudio();
+ }
+
+ protected void initUI() {
+ // Now create the basic GUI
+ play = new JButton("Play"); // Play/stop button
+ progress = new JSlider(0, 0, 0); // Shows position in sound
+ progress.setMajorTickSpacing(60000);
+ progress.setMinorTickSpacing(10000);
+ progress.setPaintTicks(true);
+ progress.setPaintLabels(true);
+
+ time = new JLabel("0"); // Shows position as a #
+ maxTime = new JLabel("/0"); // Shows position as a #
+
+ // put those controls in a row
+ Box row = Box.createHorizontalBox( );
+ row.add(play);
+ row.add(progress);
+ row.add(time);
+ row.add(maxTime);
+
+ // And add them to this component.
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+ this.add(row);
+
+ // ADD LISTENER
+
+ // When clicked, start or stop playing the sound
+ play.addActionListener(new ActionListener( ) {
+ public void actionPerformed(ActionEvent e) {
+ if (playing) {
+ stop( );
+ } else {
+ play( );
+ }
+ }
+ });
+
+ progress.addMouseListener(new MouseAdapter() {
+ boolean inPlay = false;
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ inPlay= playing;
+ if (inPlay) {
+ reader.stop();
+ }
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ int value = progress.getValue( );
+ // Update the time label
+ time.setText(value/1000 + "." + (value%1000)/100);
+ // If we're not already there, skip there.
+ if (value >= 0 && value <= reader.getLength()) {
+ reader.setPosition(value);
+ }
+
+ if (inPlay) {
+ reader.start();
+ }
+ }
+ });
+
+ // Whenever the slider value changes, update the time label.
+ progress.addChangeListener(new ChangeListener( ) {
+ public void stateChanged(ChangeEvent e) {
+ int value = progress.getValue( );
+ time.setText(value/1000 + "." + (value%1000)/100);
+ }
+ });
+ }
+
+ protected void initAudio() {
+ reader = new SammoaAudioReader();
+ reader.addDeviceStateListener(this);
+ // on se met listener de l'avancee de la lecture
+ reader.addAudioPositionListener(new SammoaAudioReader.AudioPositionListener() {
+ public void positionChange(Object source, long audioPosition) {
+ progress.setValue((int)audioPosition);
+ }
+ });
+
+ }
+
+ public void stateChanged(DeviceStateEvent event) {
+ DeviceState state = event.getNewValue();
+ if (state == DeviceState.RUNNING) {
+ this.playing = true;
+ play.setText("Stop");
+ } else {
+ this.playing = false;
+ play.setText("Play");
+ }
+ }
+
+ /**
+ * Charge un nouveau fichier
+ * @param f le fichier a charger
+ */
+ public void loadFile(File f) {
+ getAudioReader().load(f);
+ long value = getLength();
+ progress.setMaximum((int)value);
+ maxTime.setText("/" + value/1000 + "." + (value%1000)/100);
+ }
+
+ /**
+ * retourne le lecture utilise par ce composant
+ * @return
+ */
+ public SammoaAudioReader getAudioReader() {
+ return reader;
+ }
+
+ /**
+ * Donne la position actuelle de la lecture en milliseconde
+ * @return
+ */
+ public long getPosition() {
+ return getAudioReader().getPosition();
+ }
+
+ /**
+ * Donne la longueur total du fichier en milliseconde
+ * @return
+ */
+ public long getLength() {
+ return getAudioReader().getLength();
+ }
+
+ /**
+ * Start playing the sound at the current position
+ */
+ public void play() {
+ getAudioReader().start();
+ }
+
+ /**
+ * Stop playing the sound, but retain the current position
+ */
+ public void stop() {
+ getAudioReader().stop();
+ }
+
+ // The main method just creates a SoundPlayer in a Frame and displays it
+ public static void main(String[] args)
+ throws IOException, UnsupportedAudioFileException, LineUnavailableException {
+ SoundPlayer player;
+
+ File file;
+ if (args.length == 0) {
+ file = new File("/tmp/junkk1.wav");
+ } else {
+ file = new File(args[0]);
+ }
+
+ // Create a SoundPlayer object to play the sound.
+ player = new SoundPlayer();
+ player.loadFile(file);
+
+ // Put it in a window and play it
+ JFrame f = new JFrame("SoundPlayer");
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ f.getContentPane().add(player, "Center");
+ f.pack();
+ f.setVisible(true);
+ }
+
+}
\ No newline at end of file
1
0
r520 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio
by bpoussin@users.forge.codelutin.com 04 Sep '12
by bpoussin@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: bpoussin
Date: 2012-09-05 01:42:36 +0200 (Wed, 05 Sep 2012)
New Revision: 520
Url: http://forge.codelutin.com/repositories/revision/sammoa/520
Log:
lecteur et enregistreur fonctionnel
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
Copied: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java (from rev 479, trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java)
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java 2012-09-04 23:42:36 UTC (rev 520)
@@ -0,0 +1,316 @@
+package fr.ulr.sammoa.application.device.audio;
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.common.base.Preconditions;
+import fr.ulr.sammoa.application.device.DeviceState;
+import fr.ulr.sammoa.application.device.DeviceStateEvent;
+import fr.ulr.sammoa.application.device.DeviceStateListener;
+import fr.ulr.sammoa.application.device.DeviceTechnicalException;
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.DataLine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Classe permettant la lecture d'un fichier audio, et de ce deplace a une
+ * position souhaite dans ce fichier.
+ *
+ * Created: 04 septembre 2012
+ *
+ * @author Benjamin POUSSIN <poussin(a)codelutin.com>
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class SammoaAudioReader implements AudioReader {
+
+ private static final Logger logger = LoggerFactory.getLogger(SammoaAudioReader.class);
+
+ protected Clip clip; // Contents of a sampled audio file
+ protected AudioPositionTraker audioPositionTraker;
+
+ // Length and position of the sound are measured in milliseconds for
+ // sampled sounds
+ protected long audioLength; // Length of the sound.
+ protected long audioPosition = 0; // Current position within the sound
+
+ protected DeviceState state = DeviceState.UNAVAILABLE;
+
+ protected Set<DeviceStateListener> listeners = new HashSet<DeviceStateListener>();
+ protected Set<AudioPositionListener> audioPositionListener = new HashSet<AudioPositionListener>();
+
+ /**
+ * Permet de se mettre listener sur l'avancement de la lecture du fichier
+ */
+ static public interface AudioPositionListener {
+ /**
+ *
+ * @param source La source de l'evenement
+ * @param audioPosition la nouvelle position en milliseconds
+ */
+ public void positionChange(Object source, long audioPosition);
+ }
+
+ /**
+ * Classe servant a surveiller l'avancement de la lecture
+ * et a prevenir les listeners
+ */
+ static protected class AudioPositionTraker {
+ static final protected long STEP = 100; // toutes les 100 ms
+
+ protected Timer timer;
+ protected TimerTask task;
+ protected SammoaAudioReader reader;
+
+ public AudioPositionTraker(SammoaAudioReader reader) {
+ timer = new Timer("SammoaAudioReader");
+ this.reader = reader;
+ }
+
+ /**
+ * Demarre la surveillance
+ */
+ public void start() {
+ task = new TimerTask() {
+ @Override
+ public void run() {
+ if (reader.clip.isActive()) {
+ // on appele pas setPosition car, sinon on modifie la position dans le clips :(
+ // alors que c'est lui qu'on surveille et qui fait le changement
+ long old = reader.audioPosition;
+ long position = reader.getClip().getMicrosecondPosition()/1000L;
+ if (old != position) {
+ reader.audioPosition = position;
+ reader.firePositionChange(position);
+ }
+ } else {
+ reader.stop();
+ reader.setPosition(0);
+ }
+ }
+ };
+ timer.schedule(task , 0, STEP);
+ }
+
+ /**
+ * Arrete la surveillance
+ */
+ public void stop() {
+ if (task != null) {
+ task.cancel();
+ task = null;
+ }
+ }
+
+ }
+
+ public SammoaAudioReader() {
+ audioPositionTraker = new AudioPositionTraker(this);
+ }
+
+ public Clip getClip() {
+ return clip;
+ }
+
+ @Override
+ public AudioFileFormat.Type getOutputType() {
+ return AudioFileFormat.Type.WAVE;
+ }
+
+ @Override
+ public void load(File file) {
+ Preconditions.checkNotNull(file);
+ Preconditions.checkArgument(file.exists());
+ unload();
+ try {
+ // Getting a Clip object for a file of sampled audio data is kind
+ // of cumbersome. The following lines do what we need.
+ AudioInputStream ain = AudioSystem.getAudioInputStream(file);
+
+ // Get information about the format of the stream
+ AudioFormat format = ain.getFormat( );
+ DataLine.Info info = new DataLine.Info(Clip.class, format);
+
+ if (!AudioSystem.isLineSupported(info)) {
+ // This is the PCM format we want to transcode to.
+ // The parameters here are audio format details that you
+ // shouldn't need to understand for casual use.
+ AudioFormat pcm =
+ new AudioFormat(format.getSampleRate( ), 16,
+ format.getChannels( ), true, false);
+
+ // Get a wrapper stream around the input stream that does the
+ // transcoding for us.
+ ain = AudioSystem.getAudioInputStream(pcm, ain);
+
+ // Update the format and info variables for the transcoded data
+ format = ain.getFormat( );
+ info = new DataLine.Info(Clip.class, format);
+ }
+
+ try {
+ clip = (Clip) AudioSystem.getLine(info);
+ clip.open(ain);
+ }
+ finally { // We're done with the input stream.
+ ain.close( );
+ }
+ // Get the clip length in microseconds and convert to milliseconds
+ audioLength = (int)(clip.getMicrosecondLength( )/1000);
+
+ setState(DeviceState.READY);
+ logger.debug(String.format("Sound file '%s' loaded", file));
+ } catch (Exception eee) {
+ logger.error(String.format("Can't load audio file '%s'",file), eee);
+ setState(DeviceState.ERROR);
+ }
+
+ }
+
+ @Override
+ public void unload() {
+ if (clip != null) {
+ stop();
+ clip.close();
+ clip = null;
+ }
+ setState(DeviceState.UNAVAILABLE);
+ }
+
+ @Override
+ public long getLength() {
+ return audioLength;
+ }
+
+ @Override
+ public void setPosition(long position) {
+ if (clip != null) {
+ long old = audioPosition;
+ this.audioPosition = position;
+ if (old != position ) {
+ clip.setMicrosecondPosition(position * 1000L);
+ firePositionChange(position);
+ }
+ }
+ }
+
+ protected void firePositionChange(long position) {
+ for (AudioPositionListener l : audioPositionListener) {
+ l.positionChange(this, position);
+ }
+ }
+
+ @Override
+ public long getPosition() {
+ return audioPosition;
+ }
+
+ @Override
+ public void open() throws DeviceTechnicalException {
+ // no state set here, only open device and throw error
+ }
+
+ @Override
+ public void start() {
+ if (clip != null) {
+ clip.start();
+ audioPositionTraker.start(); // all time start tracker after clip
+ logger.debug("Sound playing");
+ if (state == DeviceState.READY) {
+ setState(DeviceState.RUNNING);
+ }
+ }
+ }
+
+ @Override
+ public void stop() {
+ logger.debug("Stop playing");
+ audioPositionTraker.stop();
+ if (clip != null) {
+ clip.stop( );
+ }
+
+ if (state == DeviceState.RUNNING) {
+ setState(DeviceState.READY);
+ }
+ }
+
+ @Override
+ public void close() throws DeviceTechnicalException {
+ unload();
+ }
+
+ @Override
+ public DeviceState getState() {
+ return state;
+ }
+
+ protected void setState(DeviceState state) {
+ DeviceState oldValue = getState();
+ this.state = state;
+
+ DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state);
+ for (DeviceStateListener listener : listeners) {
+ listener.stateChanged(event);
+ }
+ }
+
+ @Override
+ public void addDeviceStateListener(DeviceStateListener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public void removeDeviceStateListener(DeviceStateListener listener) {
+ listeners.remove(listener);
+ }
+
+ @Override
+ public Set<DeviceStateListener> getDeviceStateListeners() {
+ return listeners;
+ }
+
+ public void addAudioPositionListener(AudioPositionListener listener) {
+ audioPositionListener.add(listener);
+ }
+
+ public void removeAudioPositionListener(AudioPositionListener listener) {
+ audioPositionListener.remove(listener);
+ }
+
+ public Set<AudioPositionListener> getAudioPositionListeners() {
+ return audioPositionListener;
+ }
+}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 23:41:55 UTC (rev 519)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 23:42:36 UTC (rev 520)
@@ -30,9 +30,11 @@
import fr.ulr.sammoa.application.device.DeviceStateEvent;
import fr.ulr.sammoa.application.device.DeviceStateListener;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
@@ -40,16 +42,27 @@
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
-import java.io.File;
-import java.io.IOException;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
+import org.apache.commons.io.FilenameUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
- * Created: 16/05/12
+ * Classe permettant l'enregistrement d'un fichier audio. Par defaut la
+ * methode record n'ecrase jamais un fichier existant mais incremente le nom
+ * du fichier.
+ *
+ * Pour l'instant aucune compression n'est faite. Si on souhaite une compression
+ * il faut trouver une librairie de compression et modifier la ligne 284
+ * AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.PCM_SIGNED;
+ * pour utilise le format de compression choisi.
+ *
+ * Created: 27 aout 2012
*
- * @author fdesbois <desbois(a)codelutin.com>
+ * @author Benjamin POUSSIN <poussin(a)codelutin.com>
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
*/
public class SammoaAudioRecorder implements AudioRecorder {
@@ -67,16 +80,35 @@
protected AudioRecorderThread currentRecorder;
+ protected int delay;
+
public SammoaAudioRecorder(AudioConfig config) {
this.config = config;
+ init(config.getSampleRate(), config.getSampleSizeInBits(),
+ config.getRecordDelayInSeconds());
+ }
+ /**
+ * Permet de forcer le sampleRate et sampleSizeInBits
+ * @param sampleRate 8000, 11025, 16000, 22050, 44100
+ * @param sampleSizeInBits 8 ou 16
+ * @param delay le delai avant de reellement coupe un enregistrement (tous
+ * les PC ne le supporte pas)
+ */
+ public SammoaAudioRecorder(float sampleRate, int sampleSizeInBits, int delay) {
+ init(sampleRate, sampleSizeInBits, delay);
+ }
+
+ protected void init(float sampleRate, int sampleSizeInBits, int delay) {
+ this.delay = delay;
+
int channels = 1; // 1,2
boolean signed = true; // true,false
boolean bigEndian = false; // true,false
audioFormat = new AudioFormat(
- config.getSampleRate(),
- config.getSampleSizeInBits(),
+ sampleRate,
+ sampleSizeInBits,
channels,
signed,
bigEndian);
@@ -132,20 +164,11 @@
// nothing to do
}
+
@Override
public void record(File outputFile) {
- Preconditions.checkNotNull(outputFile);
-
try {
- // stop last started if necessary
- stop();
- // start new recorder thread
- currentRecorder = new AudioRecorderThread(
- audioFormat, outputType, outputFile, config.getRecordDelayInSeconds(), this);
- currentRecorder.start();
-
- setState(DeviceState.RUNNING, null);
-
+ recordStream(outputFile, false);
} catch (LineUnavailableException ex) {
fireError("Error recording " + outputFile.getName(), ex);
} catch (IllegalArgumentException ex) {
@@ -157,6 +180,49 @@
}
}
+ /**
+ * Cette methode laisse passer les exceptions sans les intercepter
+ * @param outputFile
+ * @param overwrite
+ * @throws LineUnavailableException
+ */
+ public void record(File outputFile, boolean overwrite) throws LineUnavailableException {
+ recordStream(outputFile, overwrite);
+ }
+
+ /***
+ *
+ * @param outputFile
+ * @param overwrite si faux alors on recherche un nom de fichier inexistant
+ * pour l'utiliser à la place du fichier d'entre. Par exemple si toto.wav
+ * est déjà existant, alors toto-1.wav sera utilise ou toto-2.wav, ...
+ */
+ public void recordStream(File outputFile, boolean overwrite) throws LineUnavailableException {
+ Preconditions.checkNotNull(outputFile);
+
+ if (!overwrite && outputFile.exists()) {
+ // recherche du premier fichier inexistant
+ String path = outputFile.getName();
+ String filename = FilenameUtils.getBaseName(path);
+ String ext = FilenameUtils.getExtension(path);
+
+ int i = 1;
+ while (outputFile.exists() && i < Integer.MAX_VALUE) {
+ outputFile = new File(path + "-"+(i++) + ext);
+ }
+ }
+
+ // stop last started if necessary
+ stop();
+ // start new recorder thread
+ currentRecorder = new AudioRecorderThread(
+ audioFormat, outputType, outputFile, delay, this);
+ currentRecorder.start();
+
+ setState(DeviceState.RUNNING, null);
+
+ }
+
@Override
public void stopRecord() {
stop();
@@ -211,7 +277,8 @@
targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
- AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.ULAW;
+ AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.PCM_SIGNED; //ULAW;
+
targetDataLine.open(audioFormat);
targetDataLine.start();
stream = new AudioInputStream(targetDataLine);
1
0
r519 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio
by bpoussin@users.forge.codelutin.com 04 Sep '12
by bpoussin@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: bpoussin
Date: 2012-09-05 01:41:55 +0200 (Wed, 05 Sep 2012)
New Revision: 519
Url: http://forge.codelutin.com/repositories/revision/sammoa/519
Log:
Par defaut 16 bits, 8 est vraiment trop mauvais
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java 2012-09-04 16:12:27 UTC (rev 518)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java 2012-09-04 23:41:55 UTC (rev 519)
@@ -73,7 +73,7 @@
SAMPLE_SIZE_IN_BITS(
"sammoa.audio.sampleSizeInBits",
n_("sammoa.config.audio.sampleSizeInBits"),
- "8",
+ "16",
Integer.class
),
/** Time in seconds between each record, this will record in multiple files */
1
0
r518 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio
by bpoussin@users.forge.codelutin.com 04 Sep '12
by bpoussin@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: bpoussin
Date: 2012-09-04 18:12:27 +0200 (Tue, 04 Sep 2012)
New Revision: 518
Url: http://forge.codelutin.com/repositories/revision/sammoa/518
Log:
si pas de delai on ferme tout de suite sans timer
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 16:05:15 UTC (rev 517)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 16:12:27 UTC (rev 518)
@@ -228,18 +228,25 @@
logger.debug("Ask for stop record... close in {} seconds",
delayToClose);
}
- Timer timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- targetDataLine.stop();
- targetDataLine.close();
- if (logger.isDebugEnabled()) {
- logger.debug("Closing record: {}", file);
+ if (delayToClose == 0) {
+ targetDataLine.stop();
+ targetDataLine.close();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Closing record: {}", file);
+ }
+ } else {
+ Timer timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ targetDataLine.stop();
+ targetDataLine.close();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Closing record: {}", file);
+ }
}
-
- }
- }, delayToClose * 1000);
+ }, delayToClose * 1000);
+ }
}
@Override
1
0
04 Sep '12
Author: fdesbois
Date: 2012-09-04 18:05:15 +0200 (Tue, 04 Sep 2012)
New Revision: 517
Url: http://forge.codelutin.com/repositories/revision/sammoa/517
Log:
refs #1197 : add configuration for audio + improve FlightController behavior with devices
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
trunk/sammoa-ui-swing/pom.xml
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -27,6 +27,7 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
+import fr.ulr.sammoa.application.device.audio.AudioConfig;
import fr.ulr.sammoa.application.device.gps.GpsConfig;
import fr.ulr.sammoa.persistence.AutoSaveListener;
import org.apache.commons.io.FileUtils;
@@ -89,6 +90,8 @@
protected GpsConfig gpsConfig;
+ protected AudioConfig audioConfig;
+
public SammoaConfig(String file, String... args) {
applicationConfig = new ApplicationConfig();
@@ -106,6 +109,7 @@
}
gpsConfig = new GpsConfig(applicationConfig);
+ audioConfig = new AudioConfig(applicationConfig);
try {
prepareDirectories();
@@ -147,6 +151,10 @@
return gpsConfig;
}
+ public AudioConfig getAudioConfig() {
+ return audioConfig;
+ }
+
public void save() {
applicationConfig.saveForUser();
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -28,6 +28,7 @@
import com.google.common.base.Throwables;
import com.google.common.collect.Sets;
import fr.ulr.sammoa.application.SammoaServiceSupport;
+import fr.ulr.sammoa.application.device.audio.AudioConfig;
import fr.ulr.sammoa.application.device.audio.AudioReader;
import fr.ulr.sammoa.application.device.audio.AudioReaderMock;
import fr.ulr.sammoa.application.device.audio.AudioRecorder;
@@ -53,20 +54,23 @@
deviceManagers = Sets.newHashSet();
}
- public <T extends DeviceManager> T openDeviceManager(Class<T> deviceManagerClass, boolean autoStart) {
+ public <T extends DeviceManager> T openDeviceManager(Class<T> deviceManagerClass,
+ boolean autoStart) {
T result;
if (GpsHandler.class.isAssignableFrom(deviceManagerClass)) {
result = (T) openGpsDevice(context.getConfig().getGpsConfig());
} else if (AudioRecorder.class.isAssignableFrom(deviceManagerClass)) {
- result = (T) openAudioRecorderDevice();
+ result = (T) openAudioRecorderDevice(context.getConfig().getAudioConfig());
} else if (AudioReader.class.isAssignableFrom(deviceManagerClass)) {
- result = (T) openAudioReaderDevice();
+ result = (T) openAudioReaderDevice(context.getConfig().getAudioConfig());
} else {
- throw new IllegalArgumentException("The deviceManager class " + deviceManagerClass.getName() + " is not supported");
+ throw new IllegalArgumentException("The deviceManager class "
+ + deviceManagerClass.getName()
+ + " is not supported");
}
if (autoStart) {
@@ -87,7 +91,8 @@
return null;
}
- public GpsHandler openGpsDevice(final GpsConfig config) throws DeviceTechnicalException {
+ public GpsHandler openGpsDevice(final GpsConfig config)
+ throws DeviceTechnicalException {
GpsHandler oldInstance = getDeviceManager(GpsHandler.class);
@@ -137,7 +142,8 @@
return result;
}
- public AudioRecorder openAudioRecorderDevice() throws DeviceTechnicalException {
+ public AudioRecorder openAudioRecorderDevice(final AudioConfig config)
+ throws DeviceTechnicalException {
AudioRecorder oldInstance = getDeviceManager(AudioRecorder.class);
@@ -146,13 +152,14 @@
@Override
public AudioRecorder get() {
// return new AudioRecorderDefault();
- return new SammoaAudioRecorder(44100, 16);
+ return new SammoaAudioRecorder(config);
}
});
return result;
}
- public AudioReader openAudioReaderDevice() throws DeviceTechnicalException {
+ public AudioReader openAudioReaderDevice(final AudioConfig config)
+ throws DeviceTechnicalException {
AudioReader oldInstance = getDeviceManager(AudioReader.class);
@@ -160,7 +167,7 @@
@Override
public AudioReader get() {
- return new AudioReaderMock();
+ return new AudioReaderMock(config);
}
});
return result;
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -0,0 +1,171 @@
+package fr.ulr.sammoa.application.device.audio;
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+
+import org.nuiton.util.ApplicationConfig;
+
+import static org.nuiton.i18n.I18n.n_;
+
+/**
+ * Created: 18/06/12
+ *
+ * @author fdesbois <desbois(a)codelutin.com>
+ */
+public class AudioConfig {
+
+ protected ApplicationConfig applicationConfig;
+
+ public AudioConfig(ApplicationConfig applicationConfig) {
+ this.applicationConfig = applicationConfig;
+ this.applicationConfig.loadDefaultOptions(AudioConfigOption.values());
+ }
+
+ /** @return {@link AudioConfigOption#SAMPLE_RATE} value */
+ public float getSampleRate() {
+ float result = applicationConfig.getOptionAsFloat(AudioConfigOption.SAMPLE_RATE.key);
+ return result;
+ }
+
+ /** @return {@link AudioConfigOption#SAMPLE_SIZE_IN_BITS} value */
+ public int getSampleSizeInBits() {
+ int result = applicationConfig.getOptionAsInt(AudioConfigOption.SAMPLE_SIZE_IN_BITS.key);
+ return result;
+ }
+
+ /** @return {@link AudioConfigOption#RECORD_DELAY_IN_SECONDS} value */
+ public int getRecordDelayInSeconds() {
+ int result = applicationConfig.getOptionAsInt(AudioConfigOption.RECORD_DELAY_IN_SECONDS.key);
+ return result;
+ }
+
+ public enum AudioConfigOption implements ApplicationConfig.OptionDef {
+
+ /** Sampel rate to record audio */
+ SAMPLE_RATE(
+ "sammoa.audio.sampleRate",
+ n_("sammoa.config.audio.sampleRate"),
+ "8000",
+ Float.class
+ ),
+ /** Period time in seconds for each check of the gps to update location */
+ SAMPLE_SIZE_IN_BITS(
+ "sammoa.audio.sampleSizeInBits",
+ n_("sammoa.config.audio.sampleSizeInBits"),
+ "8",
+ Integer.class
+ ),
+ /** Time in seconds between each record, this will record in multiple files */
+ RECORD_DELAY_IN_SECONDS(
+ "sammoa.audio.recordDelayInSeconds",
+ n_("sammoa.config.audio.recordDelayInSeconds"),
+ "0",
+ Integer.class
+ );
+
+ /** Configuration key. */
+ private final String key;
+
+ /** I18n key of option description */
+ private final String description;
+
+ /** Type of option */
+ private final Class<?> type;
+
+ /** Default value of option. */
+ private String defaultValue;
+
+ /** Flag to not keep option value on disk */
+ private boolean isTransient;
+
+ /** Flag to not allow option value modification */
+ private boolean isFinal;
+
+ AudioConfigOption(String key,
+ String description,
+ String defaultValue,
+ Class<?> type,
+ boolean isTransient,
+ boolean isFinal) {
+ this.key = key;
+ this.description = description;
+ this.defaultValue = defaultValue;
+ this.type = type;
+ this.isTransient = isTransient;
+ this.isFinal = isFinal;
+ }
+
+ AudioConfigOption(String key,
+ String description,
+ String defaultValue,
+ Class<?> type) {
+ this(key, description, defaultValue, type, false, false);
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public Class<?> getType() {
+ return type;
+ }
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ @Override
+ public boolean isTransient() {
+ return isTransient;
+ }
+
+ @Override
+ public boolean isFinal() {
+ return isFinal;
+ }
+
+ @Override
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ @Override
+ public void setTransient(boolean newValue) {
+ // not used
+ }
+
+ @Override
+ public void setFinal(boolean newValue) {
+ // not used
+ }
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioConfig.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -41,12 +41,18 @@
*/
public class AudioReaderMock implements AudioReader {
+ protected AudioConfig config;
+
protected long position;
protected DeviceState state = DeviceState.UNAVAILABLE;
protected Set<DeviceStateListener> listeners = Sets.newHashSet();
+ public AudioReaderMock(AudioConfig config) {
+ this.config = config;
+ }
+
@Override
public AudioFileFormat.Type getOutputType() {
return AudioFileFormat.Type.WAVE;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -43,18 +43,16 @@
/**
* Record the audio line and save the data in given {@code outputFile}. The
- * previous recording will be stopped in {@code delaySeconds}. The delay is
+ * previous recording will be stopped after some delay depends
+ * on {@link AudioConfig#getRecordDelayInSeconds()}. The delay is
* useful to avoid recording lost or too quick between two files.
*
* @param outputFile File to record
- * @param delaySeconds Delay for previous recording
*/
- void record(File outputFile, long delaySeconds);
+ void record(File outputFile);
/**
- * Stop the current recording after {@code delaySeconds}.
- *
- * @param delaySeconds Delay for current recording
+ * Stop the current recording.
*/
- void stopRecord(long delaySeconds);
+ void stopRecord();
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -81,6 +81,8 @@
private static final AudioFileFormat.Type DEFAULT_OUTPUT_TYPE = AudioFileFormat.Type.WAVE;
+ protected AudioConfig config;
+
protected AudioFormat audioFormat;
protected AudioFileFormat.Type outputType;
@@ -102,11 +104,11 @@
protected Set<DeviceStateListener> listeners;
- public AudioRecorderDefault() {
+ public AudioRecorderDefault(AudioConfig config) {
this(new AudioFormat(
DEFAULT_ENCODING,
- DEFAULT_SAMPLE_RATE,
- DEFAULT_SAMPLE_SIZE_IN_BITS,
+ config.getSampleRate(),
+ config.getSampleSizeInBits(),
DEFAULT_CHANNELS,
DEFAULT_FRAME_SIZE,
DEFAULT_FRAME_RATE,
@@ -216,7 +218,7 @@
}
@Override
- public void record(File outputFile, long delaySeconds) {
+ public void record(File outputFile) {
if (DeviceState.UNAVAILABLE == state) {
if (logger.isWarnEnabled()) {
@@ -243,7 +245,7 @@
} else if (currentRecorder == recorder1) {
if (recorder1.isRecording()) {
- recorder1.stop(delaySeconds);
+ recorder1.stop(config.getRecordDelayInSeconds());
}
if (recorder2 != null && recorder2.isRecording()) {
@@ -256,7 +258,7 @@
} else if (currentRecorder == recorder2) {
if (recorder2.isRecording()) {
- recorder2.stop(delaySeconds);
+ recorder2.stop(config.getRecordDelayInSeconds());
}
if (recorder1.isRecording()) {
@@ -276,9 +278,9 @@
}
@Override
- public void stopRecord(long delaySeconds) {
+ public void stopRecord() {
if (currentRecorder != null) {
- currentRecorder.stop(delaySeconds);
+ currentRecorder.stop(config.getRecordDelayInSeconds());
}
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -41,6 +41,12 @@
*/
public class AudioRecorderMock implements AudioRecorder {
+ protected AudioConfig config;
+
+ public AudioRecorderMock(AudioConfig config) {
+ this.config = config;
+ }
+
@Override
public DeviceState getState() {
return DeviceState.UNAVAILABLE;
@@ -62,12 +68,12 @@
}
@Override
- public void record(File outputFile, long delaySeconds) {
+ public void record(File outputFile) {
// do nothing
}
@Override
- public void stopRecord(long delaySeconds) {
+ public void stopRecord() {
// do nothing
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -55,6 +55,8 @@
private static final Logger logger = LoggerFactory.getLogger(SammoaAudioRecorder.class);
+ protected AudioConfig config;
+
protected AudioFormat audioFormat;
protected AudioFileFormat.Type outputType;
@@ -65,16 +67,16 @@
protected AudioRecorderThread currentRecorder;
- public SammoaAudioRecorder(float sampleRate, // 8000,11025,16000,22050,44100
- int sampleSizeInBits) { // 8,16
+ public SammoaAudioRecorder(AudioConfig config) {
+ this.config = config;
int channels = 1; // 1,2
boolean signed = true; // true,false
boolean bigEndian = false; // true,false
audioFormat = new AudioFormat(
- sampleRate,
- sampleSizeInBits,
+ config.getSampleRate(),
+ config.getSampleSizeInBits(),
channels,
signed,
bigEndian);
@@ -131,7 +133,7 @@
}
@Override
- public void record(File outputFile, long delaySeconds) {
+ public void record(File outputFile) {
Preconditions.checkNotNull(outputFile);
try {
@@ -139,7 +141,7 @@
stop();
// start new recorder thread
currentRecorder = new AudioRecorderThread(
- audioFormat, outputType, outputFile, delaySeconds, this);
+ audioFormat, outputType, outputFile, config.getRecordDelayInSeconds(), this);
currentRecorder.start();
setState(DeviceState.RUNNING, null);
@@ -156,7 +158,7 @@
}
@Override
- public void stopRecord(long delaySeconds) {
+ public void stopRecord() {
stop();
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -67,10 +67,6 @@
private static final TimeLog timeLog = new TimeLog(BaseFlightController.class, 500, 1000);
protected FlightService service;
-//
-// protected AudioRecorder audioRecorder;
-//
-// protected GpsHandler gpsHandler;
protected boolean initialized;
@@ -292,6 +288,8 @@
currentRoute = newCurrentRoute;
+ TransectFlight lastTransectOldValue = lastTransect;
+
if (currentRoute == null) {
if (flight.getEndDate() == null) {
@@ -337,7 +335,7 @@
if (fireChanges) {
onStateChanged(state);
- onLastTransectChanged(lastTransect);
+ onLastTransectChanged(lastTransectOldValue, lastTransect);
onNextTransectChanged(nextTransect);
onCurrentRouteChanged(currentRoute);
}
@@ -368,6 +366,7 @@
Date currentDate = geoPoint.getRecordTime();
// The next transect becomes the last one (or current in this case)
+ TransectFlight lastTransectOldValue = lastTransect;
lastTransect = nextTransect;
// Create new LEG route
@@ -388,7 +387,7 @@
// Fire events after commit
onRouteAdded(previousRoute, currentRoute);
- onLastTransectChanged(lastTransect);
+ onLastTransectChanged(lastTransectOldValue, lastTransect);
onNextTransectChanged(nextTransect);
onStateChanged(state);
@@ -581,6 +580,7 @@
Date currentDate = geoPoint.getRecordTime();
+ TransectFlight lastTransectOldValue = lastTransect;
lastTransect = null;
// Create new TRANSIT route
@@ -596,7 +596,7 @@
// Fire events after commit
onRouteAdded(previousRoute, currentRoute);
- onLastTransectChanged(lastTransect);
+ onLastTransectChanged(lastTransectOldValue, lastTransect);
onNextTransectChanged(nextTransect);
onStateChanged(state);
@@ -771,7 +771,7 @@
}
}
- protected void onLastTransectChanged(TransectFlight lastTransect) {
+ protected void onLastTransectChanged(TransectFlight oldValue, TransectFlight newValue) {
// no fire by default
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -23,6 +23,7 @@
* #L%
*/
+import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import fr.ulr.sammoa.application.device.DeviceManager;
import fr.ulr.sammoa.application.device.audio.AudioRecorder;
@@ -47,10 +48,6 @@
*/
public class FlightControllerOnBoard extends BaseFlightController implements GpsLocationListener {
- protected GpsHandler gpsHandler;
-
- protected AudioRecorder audioRecorder;
-
@Override
public <T extends DeviceManager> void openDeviceManager(Class<T> deviceManager) {
boolean autoStart = initialized && isRunning();
@@ -59,16 +56,19 @@
if (result instanceof GpsHandler) {
((GpsHandler) result).addGpsLocationListener(this);
+
+ } else if (autoStart && result instanceof AudioRecorder) {
+ restartAudio((AudioRecorder) result);
}
}
@Override
public void init(Flight flight) {
- gpsHandler = getDeviceManager(GpsHandler.class);
+ GpsHandler gpsHandler = getGpsHandler();
Preconditions.checkNotNull(gpsHandler, "You must open the gpsHandler device before init");
- audioRecorder = getDeviceManager(AudioRecorder.class);
+ AudioRecorder audioRecorder = getAudioRecorder();
Preconditions.checkNotNull(audioRecorder, "You must open the audioRecorder device before init");
super.init(flight);
@@ -81,23 +81,16 @@
audioRecorder.start();
- // Restart recording audio if onEffort or circleBack (recovery mode)
- if (state == FlightState.ON_EFFORT
- || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
-
- File audioFile = flightStorage.getAudioFile(
- lastTransect, audioRecorder.getOutputType().getExtension());
- audioRecorder.record(audioFile, 3);
- }
+ restartAudio(audioRecorder);
}
}
@Override
public void start() {
- gpsHandler.start();
+ getGpsHandler().start();
- audioRecorder.start();
+ getAudioRecorder().start();
super.start();
}
@@ -107,9 +100,9 @@
super.stop();
- audioRecorder.stop();
+ getAudioRecorder().stop();
- gpsHandler.stop();
+ getGpsHandler().stop();
}
@Override
@@ -123,7 +116,7 @@
@Override
protected GeoPoint getLocation(TopiaContext tx) throws TopiaException {
- GeoPoint result = gpsHandler.getCurrentLocation();
+ GeoPoint result = getGpsHandler().getCurrentLocation();
result.setFlight(flight);
if (result.getTopiaId() == null) {
SammoaDAOHelper.getGeoPointDAO(tx).create(result);
@@ -132,17 +125,43 @@
}
@Override
- protected void onLastTransectChanged(TransectFlight lastTransect) {
+ protected void onLastTransectChanged(TransectFlight oldValue,
+ TransectFlight newValue) {
- if (lastTransect == null) {
- audioRecorder.stopRecord(3);
+ // Record audio for the lastTransect (also current one in case of LEG)
- } else {
+ if (!Objects.equal(oldValue, newValue)) {
+
+ AudioRecorder audioRecorder = getAudioRecorder();
+
+ if (newValue == null) {
+ audioRecorder.stopRecord();
+
+ } else {
+ File audioFile = flightStorage.getAudioFile(
+ newValue, audioRecorder.getOutputType().getExtension());
+ audioRecorder.record(audioFile);
+ }
+ }
+
+ super.onLastTransectChanged(oldValue, newValue);
+ }
+
+ protected void restartAudio(AudioRecorder audioRecorder) {
+ if (state == FlightState.ON_EFFORT
+ || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
+
File audioFile = flightStorage.getAudioFile(
lastTransect, audioRecorder.getOutputType().getExtension());
- audioRecorder.record(audioFile, 3);
+ audioRecorder.record(audioFile);
}
+ }
- super.onLastTransectChanged(lastTransect);
+ protected GpsHandler getGpsHandler() {
+ return getDeviceManager(GpsHandler.class);
}
+
+ protected AudioRecorder getAudioRecorder() {
+ return getDeviceManager(AudioRecorder.class);
+ }
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -54,8 +54,6 @@
private static final Logger logger = LoggerFactory.getLogger(FlightControllerValidation.class);
- protected AudioReader audioReader;
-
protected List<GeoPoint> geoPoints;
protected List<Route> routes;
@@ -68,7 +66,7 @@
@Override
public void init(Flight flight) {
- audioReader = getDeviceManager(AudioReader.class);
+ AudioReader audioReader = getAudioReader();
Preconditions.checkNotNull(audioReader, "You must open the audioReader device before init");
super.init(flight);
@@ -95,7 +93,7 @@
);
}
- long position = audioReader.getPosition();
+ long position = getAudioReader().getPosition();
DateTime newTime;
if (position > 0) {
@@ -162,16 +160,20 @@
}
@Override
- protected void onLastTransectChanged(TransectFlight transectFlight) {
+ protected void onLastTransectChanged(TransectFlight oldValue,
+ TransectFlight newValue) {
- // Only change audio if lastTransect isn't the same
- if (!Objects.equal(lastTransect, transectFlight)) {
+ // Read audio for the lastTransect (also current one in case of LEG)
+ if (!Objects.equal(oldValue, newValue)) {
+
+ AudioReader audioReader = getAudioReader();
+
audioReader.unload();
- if (transectFlight != null) {
+ if (newValue != null) {
File file = flightStorage.getAudioFile(
- transectFlight, audioReader.getOutputType().getExtension());
+ newValue, audioReader.getOutputType().getExtension());
if (file.exists()) {
audioReader.load(file);
@@ -179,6 +181,10 @@
}
}
- super.onLastTransectChanged(transectFlight);
+ super.onLastTransectChanged(oldValue, newValue);
}
+
+ protected AudioReader getAudioReader() {
+ return getDeviceManager(AudioReader.class);
+ }
}
Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
===================================================================
--- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-09-04 16:05:15 UTC (rev 517)
@@ -1,6 +1,9 @@
sammoa.config.admin.email=Administrator's email
sammoa.config.application.site.url=Website URL of the application
sammoa.config.application.version=Version of the application
+sammoa.config.audio.recordDelayInSeconds=Delay in seconds between each audio record. This will record multiple files at the same time to avoid too sudden stops. (Warning \: this is not supported by all sound systems)
+sammoa.config.audio.sampleRate=Rate for the audio sampling (possible values \: 8000, 11025, 16000, 22050, 44100)
+sammoa.config.audio.sampleSizeInBits=Size of bits for the audio sampling (possible values \: 8, 16)
sammoa.config.background.shape.file=Location of the Background shape file
sammoa.config.backup.directory=BAckup directory where to sotre all data backup
sammoa.config.campaign.directory=Directory where are stored campaign data (maps, flight audio files,...)
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -53,6 +53,10 @@
// static class do not have instanciation
}
+ public static boolean isAnyMatchTransectFlight(Iterable<Route> routes, TransectFlight transectFlight) {
+ return Iterables.any(routes, withTransectFlight(transectFlight));
+ }
+
public static boolean isRouteLeg(Route route) {
return route != null && RouteType.LEG == route.getRouteType();
}
Modified: trunk/sammoa-ui-swing/pom.xml
===================================================================
--- trunk/sammoa-ui-swing/pom.xml 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-ui-swing/pom.xml 2012-09-04 16:05:15 UTC (rev 517)
@@ -13,6 +13,8 @@
</parent>
<artifactId>sammoa-ui-swing</artifactId>
+ <inceptionYear>2012</inceptionYear>
+ <url>http://forge.codelutin.com/projects/sammoa</url>
<name>SAMMOA :: UI Swing</name>
<description>Swing interface using Jaxx</description>
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -26,7 +26,11 @@
import fr.ulr.sammoa.application.SammoaConfig;
import fr.ulr.sammoa.application.SammoaContext;
+import fr.ulr.sammoa.application.device.DeviceManager;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
+import fr.ulr.sammoa.application.device.audio.AudioConfig;
+import fr.ulr.sammoa.application.device.audio.AudioReader;
+import fr.ulr.sammoa.application.device.audio.AudioRecorder;
import fr.ulr.sammoa.application.device.gps.GpsConfig;
import fr.ulr.sammoa.application.device.gps.GpsHandler;
import fr.ulr.sammoa.application.flightController.FlightController;
@@ -255,8 +259,7 @@
ConfigUIHelper helper = new ConfigUIHelper(config);
helper.registerCallBack(
- "ui",
- n_("sammoa.action.reload.ui"),
+ "ui", n_("sammoa.action.reload.ui"),
SwingUtil.createActionIcon("reload-ui"),
new Runnable() {
@@ -264,143 +267,186 @@
public void run() {
reloadSammoa();
}
- });
- helper.registerCallBack(
- "home",
- n_("sammoa.action.reload.home"),
- SwingUtil.createActionIcon("config"),
- new Runnable() {
+ }
+ );
- @Override
- public void run() {
- if (SammoaScreen.HOME == ui.getScreen()) {
- HomeUI homeUI = (HomeUI) currentBody;
- homeUI.getHandler().selectCampaign();
+ // APPLICATION
+ {
+ helper.addCategory(n_("sammoa.config.category.applications"),
+ n_("sammoa.config.category.applications.description"));
+ helper.registerCallBack(
+ "home", n_("sammoa.action.reload.home"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
+
+ @Override
+ public void run() {
+ if (SammoaScreen.HOME == ui.getScreen()) {
+ HomeUI homeUI = (HomeUI) currentBody;
+ homeUI.getHandler().selectCampaign();
+ }
}
}
- });
+ );
+ helper.addOption(SammoaConfig.SammoaConfigOption.SYSTEM_ID);
+ helper.setOptionCallBack("home");
+ helper.addOption(SammoaConfig.SammoaConfigOption.DATA_DIRECTORY);
+ helper.setOptionCallBack("ui");
+ helper.addOption(SammoaConfig.SammoaConfigOption.FLIGHT_NUMBER);
+ helper.addOption(SammoaConfig.SammoaConfigOption.BACKGROUND_SHAPE_FILE);
+ helper.setOptionCallBack("ui");
+ helper.addOption(SammoaConfig.SammoaConfigOption.AUTO_COMMIT_DELAY); // milliseconds
+ helper.setOptionCallBack("ui");
+ }
- // categorie applications
- helper.addCategory(n_("sammoa.config.category.applications"),
- n_("sammoa.config.category.applications.description"));
+ // SHORTCUT
+ {
+ helper.addCategory(n_("sammoa.config.category.shortcuts"),
+ n_("sammoa.config.category.shortcuts.description"));
+ helper.registerCallBack(
+ "actions", n_("sammoa.action.reload.actions"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
- helper.addOption(SammoaConfig.SammoaConfigOption.SYSTEM_ID);
- helper.setOptionCallBack("home");
- helper.addOption(SammoaConfig.SammoaConfigOption.DATA_DIRECTORY);
- helper.setOptionCallBack("ui");
-// helper.addOption(SammoaConfig.SammoaConfigOption.CAMPAIGN_DIRECTORY);
-// helper.setOptionCallBack("ui");
- helper.addOption(SammoaConfig.SammoaConfigOption.FLIGHT_NUMBER);
- helper.addOption(SammoaConfig.SammoaConfigOption.BACKGROUND_SHAPE_FILE);
- helper.setOptionCallBack("ui");
- // milliseconds
- helper.addOption(SammoaConfig.SammoaConfigOption.AUTO_COMMIT_DELAY);
- helper.setOptionCallBack("ui");
+ @Override
+ public void run() {
-// helper.addOption(SammoaConfig.SammoaConfigOption.STRATE_SHAPE_FILE);
-// helper.setOptionCallBack("ui");
-// helper.addOption(SammoaConfig.SammoaConfigOption.TRANSECT_SHAPE_FILE);
-// helper.setOptionCallBack("ui");
+ if (SammoaScreen.FLIGHT == ui.getScreen()
+ || SammoaScreen.VALIDATION == ui.getScreen()) {
- helper.registerCallBack("actions",
- n_("sammoa.action.reload.actions"),
- SwingUtil.createActionIcon("config"),
- new Runnable() {
+ FlightUI flightUI = (FlightUI) currentBody;
+ flightUI.getHandler().initActions();
+ }
+ }
+ }
+ );
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_START);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_STOP);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_BEGIN);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_END);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_NEXT);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_ADD);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_LEFT_OBSERVATION);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CENTER_OBSERVATION);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_RIGHT_OBSERVATION);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CIRCLE_BACK);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_TRANSECT);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_OBSERVATION);
+ helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_ROUTE);
+ helper.setOptionCallBack("actions");
+ }
- @Override
- public void run() {
+ // GPS
+ {
+ helper.addCategory(n_("sammoa.config.category.gps"),
+ n_("sammoa.config.category.gps.description"));
+ helper.registerCallBack(
+ "gps", n_("sammoa.action.reload.gps"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
- if (SammoaScreen.FLIGHT == ui.getScreen()
- || SammoaScreen.VALIDATION == ui.getScreen()) {
+ @Override
+ public void run() {
- FlightUI flightUI = (FlightUI) currentBody;
- flightUI.getHandler().initActions();
- }
- }
- });
- // categorie raccourcis
- helper.addCategory(n_("sammoa.config.category.shortcuts"),
- n_("sammoa.config.category.shortcuts.description"));
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_START);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_STOP);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_BEGIN);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_END);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_NEXT);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_ADD);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_LEFT_OBSERVATION);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CENTER_OBSERVATION);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_RIGHT_OBSERVATION);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CIRCLE_BACK);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_TRANSECT);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_OBSERVATION);
- helper.setOptionCallBack("actions");
- helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_ROUTE);
- helper.setOptionCallBack("actions");
+ if (SammoaScreen.FLIGHT == ui.getScreen()) {
- // gps
- helper.registerCallBack("gps",
- n_("sammoa.action.reload.gps"),
- SwingUtil.createActionIcon("config"),
- new Runnable() {
+ reloadDevice((FlightUI) currentBody, GpsHandler.class);
+ }
+ }
+ }
+ );
+ helper.addOption(GpsConfig.GpsConfigOption.GPS_HANDLER,
+ SammoaConfig.PROPERTY_GPS_CONFIG + "." + GpsConfig.PROPERTY_GPS_HNALDER_CLASS);
+ helper.setOptionCallBack("gps");
+ helper.addOption(GpsConfig.GpsConfigOption.GPS_DEVICE);
+ helper.setOptionCallBack("gps");
+ helper.addOption(GpsConfig.GpsConfigOption.GPS_SPEED);
+ helper.setOptionCallBack("gps");
+ helper.addOption(GpsConfig.GpsConfigOption.GPS_CHECK_PERIOD);
+ helper.setOptionCallBack("gps");
+ helper.addOption(GpsConfig.GpsConfigOption.GPS_TIMEOUT);
+ helper.setOptionCallBack("gps");
+ }
- @Override
- public void run() {
+ // AUDIO
+ {
+ helper.addCategory(n_("sammoa.config.category.audio"),
+ n_("sammoa.config.category.audio.description"));
+ helper.registerCallBack(
+ "audio", n_("sammoa.action.reload.audio"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
- if (SammoaScreen.FLIGHT == ui.getScreen()) {
+ @Override
+ public void run() {
- FlightUI flightUI = (FlightUI) currentBody;
+ if (SammoaScreen.FLIGHT == ui.getScreen()) {
- try {
- FlightController flightController = flightUI.getHandler().getFlightController();
- flightController.openDeviceManager(GpsHandler.class);
- } catch (DeviceTechnicalException ex) {
- logger.error("Error on new GpsHandler", ex);
- SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause());
- }
- }
- }
- });
- helper.addCategory(n_("sammoa.config.category.gps"),
- n_("sammoa.config.category.gps.description"));
- helper.addOption(GpsConfig.GpsConfigOption.GPS_HANDLER,
- SammoaConfig.PROPERTY_GPS_CONFIG + "." + GpsConfig.PROPERTY_GPS_HNALDER_CLASS);
- helper.setOptionCallBack("gps");
- helper.addOption(GpsConfig.GpsConfigOption.GPS_DEVICE);
- helper.setOptionCallBack("gps");
- helper.addOption(GpsConfig.GpsConfigOption.GPS_SPEED);
- helper.setOptionCallBack("gps");
- helper.addOption(GpsConfig.GpsConfigOption.GPS_CHECK_PERIOD);
- helper.setOptionCallBack("gps");
- helper.addOption(GpsConfig.GpsConfigOption.GPS_TIMEOUT);
- helper.setOptionCallBack("gps");
+ reloadDevice((FlightUI) currentBody, AudioRecorder.class);
- // others
- helper.addCategory(n_("sammoa.config.category.other"),
- n_("sammoa.config.category.other.description"));
+ } else if (SammoaScreen.VALIDATION == ui.getScreen()) {
- helper.addOption(SammoaConfig.SammoaConfigOption.LOCALE);
- helper.setOptionCallBack("ui");
+ reloadDevice((FlightUI) currentBody, AudioReader.class);
+ }
+ }
+ }
+ );
+ helper.addOption(AudioConfig.AudioConfigOption.SAMPLE_RATE);
+ helper.setOptionCallBack("audio");
+ helper.addOption(AudioConfig.AudioConfigOption.SAMPLE_SIZE_IN_BITS);
+ helper.setOptionCallBack("audio");
+ helper.addOption(AudioConfig.AudioConfigOption.RECORD_DELAY_IN_SECONDS);
+ helper.setOptionCallBack("audio");
+ }
- helper.addOption(SammoaConfig.SammoaConfigOption.SITE_URL);
- helper.addOption(SammoaConfig.SammoaConfigOption.UI_CONFIG_FILE);
- helper.setOptionCallBack("ui");
+ // OTHER
+ {
+ helper.addCategory(n_("sammoa.config.category.other"),
+ n_("sammoa.config.category.other.description"));
+ helper.addOption(SammoaConfig.SammoaConfigOption.LOCALE);
+ helper.setOptionCallBack("ui");
+ helper.addOption(SammoaConfig.SammoaConfigOption.SITE_URL);
+ helper.addOption(SammoaConfig.SammoaConfigOption.UI_CONFIG_FILE);
+ helper.setOptionCallBack("ui");
+ }
helper.buildUI(ui, "sammoa.config.category.applications");
helper.displayUI(ui, false);
}
+ /**
+ * Reload the given device identified by its {@code deviceManagerClass} for
+ * {@code ui}.
+ *
+ * @param ui FlightUI contains the controller that manage devices
+ * @param deviceManagerClass Class of the device to reload
+ * @param <T> Type of {@link DeviceManager}
+ * @see FlightController#openDeviceManager(Class)
+ */
+ protected <T extends DeviceManager> void reloadDevice(FlightUI ui,
+ Class<T> deviceManagerClass) {
+ try {
+ FlightController flightController = ui.getHandler().getFlightController();
+ flightController.openDeviceManager(deviceManagerClass);
+ } catch (DeviceTechnicalException ex) {
+ logger.error("Error on new " + deviceManagerClass.getSimpleName(), ex);
+ SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause());
+ }
+ }
+
public void showHome() {
if (checkCurrentFlight(_("sammoa.confirmDialog.flightInProgress.message.showHome"))) {
setScreen(SammoaScreen.HOME);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-04 16:05:15 UTC (rev 517)
@@ -569,10 +569,10 @@
((TransectFlightModel) input).getSource();
// Enabled only if no route match the transectFlight
- // Note : the deleted route case is too complex, the user must delete routes before transect
- boolean result = FluentIterable
- .from(getModel().getRoutes())
- .anyMatch(Routes.withTransectFlight(transectFlight));
+ // Note : the deleted route case is too complex,
+ // the user must delete routes before transect
+ boolean result = Routes.isAnyMatchTransectFlight(
+ getModel().getRoutes(), transectFlight);
return !result;
}
});
@@ -600,7 +600,16 @@
@Override
public boolean apply(Object input) {
- return !((TransectFlightModel) input).isDeleted();
+ TransectFlight transectFlight =
+ ((TransectFlightModel) input).getSource();
+
+ // Enabled only if no route match the transectFlight
+ // Note : the deleted route case is too complex,
+ // the user must create a new transectFlight to
+ // use it as next one
+ boolean result = Routes.isAnyMatchTransectFlight(
+ getModel().getRoutes(), transectFlight);
+ return !result;
}
});
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-04 16:04:55 UTC (rev 516)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-04 16:05:15 UTC (rev 517)
@@ -37,7 +37,8 @@
sammoa.action.quitExportMaps=Quit
sammoa.action.quitImportApplication=Quit
sammoa.action.reload.actions=Reload actions
-sammoa.action.reload.gps=Reload GPS
+sammoa.action.reload.audio=Relad Audio device
+sammoa.action.reload.gps=Reload GPS device
sammoa.action.reload.home=Reload home screen
sammoa.action.reload.ui=Reload sammoa ui
sammoa.action.right.tip=RIGHT \: create a new Observation for the observer on the right side
@@ -56,9 +57,10 @@
sammoa.action.validTransect=Transect
sammoa.action.validTransect.tip=Validate the selected transect and all its routes and observations
sammoa.action.validation=Validation
-sammoa.askQuestion.deleteTransect.message=
sammoa.config.category.applications=Application
sammoa.config.category.applications.description=Application
+sammoa.config.category.audio=Audio
+sammoa.config.category.audio.description=Audio configuration
sammoa.config.category.gps=GPS
sammoa.config.category.gps.description=GPS configuration
sammoa.config.category.other=Other
1
0
r516 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action
by fdesbois@users.forge.codelutin.com 04 Sep '12
by fdesbois@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: fdesbois
Date: 2012-09-04 18:04:55 +0200 (Tue, 04 Sep 2012)
New Revision: 516
Url: http://forge.codelutin.com/repositories/revision/sammoa/516
Log:
Add file header
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-04 16:04:41 UTC (rev 515)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-04 16:04:55 UTC (rev 516)
@@ -1,5 +1,29 @@
package fr.ulr.sammoa.ui.swing.flight.action;
+/*
+ * #%L
+ * SAMMOA :: UI Swing
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.flightController.FlightState;
import fr.ulr.sammoa.ui.swing.flight.FlightUI;
1
0
r515 - in trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application: flightController io
by fdesbois@users.forge.codelutin.com 04 Sep '12
by fdesbois@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: fdesbois
Date: 2012-09-04 18:04:41 +0200 (Tue, 04 Sep 2012)
New Revision: 515
Url: http://forge.codelutin.com/repositories/revision/sammoa/515
Log:
refs #1197 : use lastTransect reference to save audio
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 12:48:41 UTC (rev 514)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 16:04:41 UTC (rev 515)
@@ -237,9 +237,9 @@
startTime = timeLog.log(startTime, "start()", "Commited");
// Fire events after commit
- fireRouteAdded(previousRoute, currentRoute);
- fireNextTransectChanged(nextTransect);
- fireStateChanged(state);
+ onRouteAdded(previousRoute, currentRoute);
+ onNextTransectChanged(nextTransect);
+ onStateChanged(state);
timeLog.log(startTime, "start()", "Fired");
@@ -265,7 +265,7 @@
this.nextTransect = nextTransect;
// Fire transect changed
- fireNextTransectChanged(nextTransect);
+ onNextTransectChanged(nextTransect);
timeLog.log(startTime, "setNextTransect()", "Fired");
}
@@ -279,7 +279,7 @@
setCurrentRoute(currentRoute, false);
}
- private void setCurrentRoute(Route currentRoute, boolean fireChanges) {
+ private void setCurrentRoute(Route newCurrentRoute, boolean fireChanges) {
long startTime = TimeLog.getTime();
@@ -287,9 +287,11 @@
"The controller must be initialized before calling any action");
if (logger.isInfoEnabled()) {
- logger.info("Set currentRoute : {}", Routes.toString(currentRoute));
+ logger.info("Set currentRoute : {}", Routes.toString(newCurrentRoute));
}
+ currentRoute = newCurrentRoute;
+
if (currentRoute == null) {
if (flight.getEndDate() == null) {
@@ -298,39 +300,46 @@
} else {
state = FlightState.ENDED;
}
- this.currentRoute = null;
} else {
+ // Use previous not deleted route
if (currentRoute.isDeleted()) {
- this.currentRoute = service.getPreviousRoute(currentRoute);
- } else {
- this.currentRoute = currentRoute;
+ currentRoute = service.getPreviousRoute(newCurrentRoute);
}
- if (this.currentRoute.getRouteType() == RouteType.LEG) {
- state = FlightState.ON_EFFORT;
+ // Update state, lastTransect and nextTransect depends on routeType
+ switch (currentRoute.getRouteType()) {
- } else {
- state = FlightState.OFF_EFFORT;
- }
+ case LEG:
+ state = FlightState.ON_EFFORT;
+ lastTransect = service.getPreviousTransect(currentRoute);
+ nextTransect = flight.getNextTransectFlightFrom(lastTransect);
+ break;
- lastTransect = service.getPreviousTransect(this.currentRoute);
+ case CIRCLE_BACK:
+ state = FlightState.OFF_EFFORT;
+ lastTransect = service.getPreviousTransect(currentRoute);
+ nextTransect = lastTransect;
+ break;
- // Selection of the nextTransect, keep the last one for circleBack
- if (this.currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
- nextTransect = lastTransect;
+ case TRANSIT:
+ state = FlightState.OFF_EFFORT;
+ lastTransect = null;
+ nextTransect = flight.getNextTransectFlightFrom(
+ service.getPreviousTransect(currentRoute));
+ break;
- } else {
- nextTransect = flight.getNextTransectFlightFrom(lastTransect);
+ default:
}
}
if (fireChanges) {
- fireStateChanged(state);
- fireNextTransectChanged(nextTransect);
- fireCurrentRouteChanged(this.currentRoute);
+ onStateChanged(state);
+ onLastTransectChanged(lastTransect);
+ onNextTransectChanged(nextTransect);
+ onCurrentRouteChanged(currentRoute);
}
timeLog.log(startTime, "setCurrentRoute()");
@@ -378,9 +387,10 @@
startTime = timeLog.log(startTime, "begin()", "Commited");
// Fire events after commit
- fireRouteAdded(previousRoute, currentRoute);
- fireNextTransectChanged(nextTransect);
- fireStateChanged(state);
+ onRouteAdded(previousRoute, currentRoute);
+ onLastTransectChanged(lastTransect);
+ onNextTransectChanged(nextTransect);
+ onStateChanged(state);
timeLog.log(startTime, "begin()", "Fired");
@@ -431,9 +441,9 @@
startTime = timeLog.log(startTime, "circleBack()", "Commited");
// Fire events after commit
- fireRouteAdded(previousRoute, currentRoute);
- fireNextTransectChanged(nextTransect);
- fireStateChanged(state);
+ onRouteAdded(previousRoute, currentRoute);
+ onNextTransectChanged(nextTransect);
+ onStateChanged(state);
timeLog.log(startTime, "circleBack()", "Fired");
@@ -475,7 +485,7 @@
startTime = timeLog.log(startTime, "add()", "Commited");
// Fire events after commit
- fireRouteAdded(previousRoute, currentRoute);
+ onRouteAdded(previousRoute, currentRoute);
timeLog.log(startTime, "add()", "Fired");
@@ -541,7 +551,7 @@
startTime = timeLog.log(startTime, "observation()", "Commited");
- fireObservationAdded(observation, geoPoint);
+ onObservationAdded(observation, geoPoint);
timeLog.log(startTime, "observation()", "Fired");
@@ -571,6 +581,8 @@
Date currentDate = geoPoint.getRecordTime();
+ lastTransect = null;
+
// Create new TRANSIT route
if (logger.isInfoEnabled()) {
logger.info(String.format("Create TRANSIT [END] at %1$tH:%1$tM:%1$tS.%1$tL", currentDate));
@@ -583,9 +595,10 @@
transaction.commitTransaction();
// Fire events after commit
- fireRouteAdded(previousRoute, currentRoute);
- fireNextTransectChanged(nextTransect);
- fireStateChanged(state);
+ onRouteAdded(previousRoute, currentRoute);
+ onLastTransectChanged(lastTransect);
+ onNextTransectChanged(nextTransect);
+ onStateChanged(state);
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
@@ -634,9 +647,9 @@
startTime = timeLog.log(startTime, "stop()", "Commited");
// Fire events after commit
- fireCurrentRouteChanged(currentRoute);
- fireNextTransectChanged(nextTransect);
- fireStateChanged(state);
+ onCurrentRouteChanged(currentRoute);
+ onNextTransectChanged(nextTransect);
+ onStateChanged(state);
timeLog.log(startTime, "stop()", "Fired");
@@ -724,20 +737,20 @@
return deviceManagerProvider;
}
- protected void fireObservationAdded(Observation observation, GeoPoint location) {
+ protected void onObservationAdded(Observation observation, GeoPoint location) {
ObservationEvent event = new ObservationEvent(this, observation, location);
for (FlightControllerListener listener : listeners) {
listener.onObservationAdded(event);
}
}
- protected void fireStateChanged(FlightState state) {
+ protected void onStateChanged(FlightState state) {
for (FlightControllerListener listener : listeners) {
listener.onStateChanged(state);
}
}
- protected void fireRouteAdded(Route previousRoute, Route newRoute) {
+ protected void onRouteAdded(Route previousRoute, Route newRoute) {
Preconditions.checkNotNull(newRoute);
RouteEvent event = new RouteEvent(this, newRoute, true, previousRoute);
for (FlightControllerListener listener : listeners) {
@@ -745,17 +758,21 @@
}
}
- protected void fireCurrentRouteChanged(Route route) {
+ protected void onCurrentRouteChanged(Route route) {
RouteEvent event = new RouteEvent(this, route, false, null);
for (FlightControllerListener listener : listeners) {
listener.onCurrentRouteChanged(event);
}
}
- protected void fireNextTransectChanged(TransectFlight nextTransect) {
+ protected void onNextTransectChanged(TransectFlight nextTransect) {
for (FlightControllerListener listener : listeners) {
listener.onNextTransectChanged(nextTransect);
}
}
+ protected void onLastTransectChanged(TransectFlight lastTransect) {
+ // no fire by default
+ }
+
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 12:48:41 UTC (rev 514)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 16:04:41 UTC (rev 515)
@@ -32,7 +32,6 @@
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPoints;
-import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
import fr.ulr.sammoa.persistence.SammoaDAOHelper;
import fr.ulr.sammoa.persistence.TransectFlight;
@@ -46,7 +45,7 @@
*
* @author fdesbois <florian.desbois(a)codelutin.com>
*/
-public class FlightControllerOnBoard extends BaseFlightController implements GpsLocationListener, FlightControllerListener {
+public class FlightControllerOnBoard extends BaseFlightController implements GpsLocationListener {
protected GpsHandler gpsHandler;
@@ -74,8 +73,6 @@
super.init(flight);
- addFlightControllerListener(this);
-
initCurrentRoute(service.getLastUnfinishedRoute(flight));
if (isRunning()) {
@@ -84,11 +81,13 @@
audioRecorder.start();
- // Restart recording audio if onEffort or circleBack
+ // Restart recording audio if onEffort or circleBack (recovery mode)
if (state == FlightState.ON_EFFORT
- || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
+ || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
- saveAudio(3);
+ File audioFile = flightStorage.getAudioFile(
+ lastTransect, audioRecorder.getOutputType().getExtension());
+ audioRecorder.record(audioFile, 3);
}
}
}
@@ -133,45 +132,17 @@
}
@Override
- public void onCurrentRouteChanged(RouteEvent event) {
- if (event.isNew()) {
+ protected void onLastTransectChanged(TransectFlight lastTransect) {
- Route newRoute = event.getRoute();
+ if (lastTransect == null) {
+ audioRecorder.stopRecord(3);
- if (RouteType.LEG == newRoute.getRouteType()
- || RouteType.CIRCLE_BACK == newRoute.getRouteType()) {
-
- saveAudio(3);
-
- } else {
-
- // Stop recording after 2 minutes (120 seconds)
- audioRecorder.stopRecord(120);
- }
+ } else {
+ File audioFile = flightStorage.getAudioFile(
+ lastTransect, audioRecorder.getOutputType().getExtension());
+ audioRecorder.record(audioFile, 3);
}
- }
- @Override
- public void onNextTransectChanged(TransectFlight nextTransect) {
- // nothing to do
+ super.onLastTransectChanged(lastTransect);
}
-
- @Override
- public void onStateChanged(FlightState state) {
- // nothing to do
- }
-
- @Override
- public void onObservationAdded(ObservationEvent event) {
- // nothing to do
- }
-
- protected void saveAudio(long delaySeconds) {
-
- String extension = audioRecorder.getOutputType().getExtension();
-
- File audioFile = flightStorage.getAudioFile(currentRoute, extension);
-
- audioRecorder.record(audioFile, delaySeconds);
- }
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 12:48:41 UTC (rev 514)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 16:04:41 UTC (rev 515)
@@ -23,6 +23,7 @@
* #L%
*/
+import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import fr.ulr.sammoa.application.device.DeviceManager;
import fr.ulr.sammoa.application.device.audio.AudioReader;
@@ -49,8 +50,7 @@
*
* @author fdesbois <florian.desbois(a)codelutin.com>
*/
-public class FlightControllerValidation extends BaseFlightController
-implements FlightControllerListener {
+public class FlightControllerValidation extends BaseFlightController {
private static final Logger logger = LoggerFactory.getLogger(FlightControllerValidation.class);
@@ -73,8 +73,6 @@
super.init(flight);
- addFlightControllerListener(this);
-
initCurrentRoute(null);
geoPoints = service.getFlightGeoPoints(flight);
@@ -101,33 +99,10 @@
DateTime newTime;
if (position > 0) {
-
newTime = previousTime.plus(position);
} else {
-
newTime = new DateTime(previousTime);
-
-// // Arbitrary add 1 second for the newTime
-// newTime = DateUtils.addMilliseconds(previousTime, 1000);
-//
-// // Ensure that newTime is before nextRoute time
-// Route nextRoute = Routes.findNext(routes, currentRoute);
-// if (nextRoute != null) {
-//
-// logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL",
-// nextRoute.getRouteType(),
-// nextRoute.getBeginTime())
-// );
-//
-// // If greater or equals than the nextRoute, we use the middle
-// // time between previous and next route
-// if (newTime.after(nextRoute.getBeginTime())
-// || newTime.equals(nextRoute.getBeginTime())) {
-//
-// newTime = Routes.getMiddleTime(currentRoute, nextRoute);
-// }
-// }
}
if (logger.isDebugEnabled()) {
@@ -147,12 +122,6 @@
result.setSpeed(location.getSpeed());
result.setAltitude(location.getAltitude());
-// // Ensure captureDelay of the new recording time
-// long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE);
-// long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE);
-// int captureDelay = (int) newSeconds - (int) locationSeconds;
-// result.setCaptureDelay(captureDelay);
-
int captureDelay = Dates
.toInterval(locationTime, newTime)
.toDuration()
@@ -176,49 +145,40 @@
return result;
}
+
@Override
- public void onCurrentRouteChanged(RouteEvent event) {
- if (event.isNew()) {
- if (logger.isDebugEnabled()) {
- logger.debug("Add route {} to cache", Routes.toString(event.getRoute()));
- }
- routes.add(event.getRoute());
+ protected void onRouteAdded(Route previousRoute, Route newRoute) {
- } else {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Add route {} to cache", Routes.toString(newRoute));
+ }
+ routes.add(newRoute);
+ // Ensure previous, it could be different from argument because
+ // the audio time could overflow on more than one route
+ previousRoute = Routes.findPrevious(routes, newRoute);
+
+ super.onRouteAdded(previousRoute, newRoute);
+ }
+
+ @Override
+ protected void onLastTransectChanged(TransectFlight transectFlight) {
+
+ // Only change audio if lastTransect isn't the same
+ if (!Objects.equal(lastTransect, transectFlight)) {
+
audioReader.unload();
- if (currentRoute != null) {
+ if (transectFlight != null) {
File file = flightStorage.getAudioFile(
- currentRoute, audioReader.getOutputType().getExtension());
+ transectFlight, audioReader.getOutputType().getExtension());
if (file.exists()) {
audioReader.load(file);
}
}
}
- }
- @Override
- public void onNextTransectChanged(TransectFlight nextTransect) {
- // nothing to do
+ super.onLastTransectChanged(transectFlight);
}
-
- @Override
- public void onStateChanged(FlightState state) {
- // nothing to do
- }
-
- @Override
- public void onObservationAdded(ObservationEvent event) {
- // nothing to do
- }
-
- @Override
- protected void fireRouteAdded(Route previousRoute, Route newRoute) {
-
- // Ensure previous, it could be different from argument because
- // the audio time could overflow on more than one route
- super.fireRouteAdded(Routes.findPrevious(routes, newRoute), newRoute);
- }
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-09-04 12:48:41 UTC (rev 514)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-09-04 16:04:41 UTC (rev 515)
@@ -29,7 +29,7 @@
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Region;
-import fr.ulr.sammoa.persistence.Route;
+import fr.ulr.sammoa.persistence.TransectFlight;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.nuiton.util.decorator.Decorator;
@@ -54,9 +54,9 @@
return SammoaDirectories.getAudioDirectory(getDirectory());
}
- public File getAudioFile(Route route, String ext) {
+ public File getAudioFile(TransectFlight transectFlight, String ext) {
- String fileName = route.getTopiaId() + "." + ext;
+ String fileName = transectFlight.getTopiaId() + "." + ext;
return new File(getAudioDirectory(), fileName);
}
1
0
r514 - in trunk: . sammoa-ui-swing sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util
by fdesbois@users.forge.codelutin.com 04 Sep '12
by fdesbois@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: fdesbois
Date: 2012-09-04 14:48:41 +0200 (Tue, 04 Sep 2012)
New Revision: 514
Url: http://forge.codelutin.com/repositories/revision/sammoa/514
Log:
fixes #1416 : use swing-bits for sorting and filtering. Be careful of conversion between model and view indexes in tables.
Removed:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectCrossingNumberCellRenderer.java
Modified:
trunk/pom.xml
trunk/sammoa-ui-swing/pom.xml
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/AbstractRowHighlightPredicate.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/pom.xml 2012-09-04 12:48:41 UTC (rev 514)
@@ -305,6 +305,12 @@
<version>${swingXVersion}</version>
</dependency>
+ <dependency>
+ <groupId>com.ezware.oxbow</groupId>
+ <artifactId>swing-bits</artifactId>
+ <version>0.5.0</version>
+ </dependency>
+
<!-- librairie topia -->
<dependency>
<groupId>org.nuiton.topia</groupId>
Modified: trunk/sammoa-ui-swing/pom.xml
===================================================================
--- trunk/sammoa-ui-swing/pom.xml 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/pom.xml 2012-09-04 12:48:41 UTC (rev 514)
@@ -137,6 +137,11 @@
<artifactId>swingx-common</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.ezware.oxbow</groupId>
+ <artifactId>swing-bits</artifactId>
+ </dependency>
+
<!-- Validation -->
<dependency>
<groupId>org.nuiton.jaxx</groupId>
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -341,6 +341,8 @@
helper.setOptionCallBack("actions");
helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CIRCLE_BACK);
helper.setOptionCallBack("actions");
+ helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_TRANSECT);
+ helper.setOptionCallBack("actions");
helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_OBSERVATION);
helper.setOptionCallBack("actions");
helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_ROUTE);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -143,6 +143,7 @@
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
+import java.awt.Component;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
@@ -486,7 +487,7 @@
int index = TransectFlightModel.indexOfTransectFlight(
getModel().getTransectFlights(), route.getTransectFlight());
- ui.getTransectFlightSelectionModel().setSelectionInterval(index, index);
+ SammoaUtil.selectTableRow(ui.getTransectTable(), index);
}
transectFlightSelectionIsAdjusting = false;
@@ -776,7 +777,7 @@
// Retrieve the last selected row from the table
JTable table = ui.getTransectTable();
- int fromIndex = SammoaUtil.getLastSelectedRow(table);
+ int fromIndex = SammoaUtil.getLastSelectedTableRow(table);
if (fromIndex == -1) {
// Add after the last row
fromIndex = table.getRowCount();
@@ -1226,7 +1227,8 @@
Transect transectBean = referentialService.getTransect(transectId);
- StrateModel strate = Iterables.find(getModel().getStrates(), StrateModel.withStrate(transectBean.getStrate()));
+ StrateModel strate = Iterables.find(
+ getModel().getStrates(), StrateModel.withStrate(transectBean.getStrate()));
TransectModel transect = new TransectModel(transectBean);
@@ -1235,8 +1237,35 @@
ui.getStrateCombobox().setSelectedItem(strate);
- // Maybe auto-scroll ? auto-selection ?
+ ui.getTransectList().ensureIndexIsVisible(strate.getTransects().size() - 1);
}
}
};
+
+ private static class TransectCrossingNumberCellRenderer implements TableCellRenderer {
+
+ protected TableCellRenderer delegate;
+
+ protected TransectTableModel model;
+
+ public TransectCrossingNumberCellRenderer(TableCellRenderer delegate,
+ TransectTableModel model) {
+ this.delegate = delegate;
+ this.model = model;
+ }
+
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+
+ TransectFlightModel transectFlight = model.getRow(table.convertRowIndexToModel(row));
+ TransectModel transect = transectFlight.getTransect();
+
+ int crossingNumber = transectFlight.getCrossingNumber();
+ int realNbTimes = transect.getRealNbTimes();
+
+ String newValue = crossingNumber + " (" + realNbTimes + ")";
+
+ return delegate.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column);
+ }
+ }
}
Deleted: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectCrossingNumberCellRenderer.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectCrossingNumberCellRenderer.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectCrossingNumberCellRenderer.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -1,60 +0,0 @@
-package fr.ulr.sammoa.ui.swing.flight;
-/*
- * #%L
- * SAMMOA :: UI Swing
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 UMS 3462, Code Lutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-import java.awt.Component;
-
-/**
- * Created: 18/07/12
- *
- * @author fdesbois <desbois(a)codelutin.com>
- */
-public class TransectCrossingNumberCellRenderer implements TableCellRenderer {
-
- protected TableCellRenderer delegate;
-
- protected TransectTableModel model;
-
- public TransectCrossingNumberCellRenderer(TableCellRenderer delegate,
- TransectTableModel model) {
- this.delegate = delegate;
- this.model = model;
- }
-
- @Override
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-
- TransectFlightModel transectFlight = model.getRow(row);
- TransectModel transect = transectFlight.getTransect();
-
- int crossingNumber = transectFlight.getCrossingNumber();
- int realNbTimes = transect.getRealNbTimes();
-
- String newValue = crossingNumber + " (" + realNbTimes + ")";
-
- return delegate.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column);
- }
-}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -23,6 +23,7 @@
* #L%
*/
+import com.ezware.oxbow.swingbits.table.filter.TableRowFilterSupport;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -264,8 +265,6 @@
}
// Fire on TableModel to update the row (highlighting)
- // ensureRowIndex in case of new route, otherwise the size is
- // not updated yet in tableModel and an IndexOutOfBounds appears
int index = getModel().indexOfRoutes(route);
SwingUtil.ensureRowIndex(ui.getRouteTableModel(), index);
ui.getRouteTableModel().fireTableRowsUpdated(index, index);
@@ -572,9 +571,6 @@
selectRouteByObservation(newValue);
}
-// else {
-// SammoaUtil.unselectAll(ui.getObservationTable());
-// }
}
});
@@ -778,6 +774,10 @@
table.setDefaultEditor(Date.class, new TimeCellEditor(datePicker));
}
+ if (getModel().isValidationMode()) {
+ TableRowFilterSupport.forTable(table).searchable(true).apply();
+ }
+
SammoaUtil.addTableSelectionListener(table, selectionModelAdapter);
SwingUtil.scrollToTableSelection(table);
@@ -789,13 +789,11 @@
protected void fireObservationsUpdated(Route route, boolean scrollToFirst) {
- FlightUIModel model = getModel();
-
Iterable<Observation> observations = Observations.filterInRoute(
- model.getObservations(), route, model.getRoutes(), true);
+ getModel().getObservations(), route, getModel().getRoutes(), true);
SammoaUtil.fireTableRowsUpdated(ui.getObservationTable(),
- model.getObservations(),
+ getModel().getObservations(),
observations,
scrollToFirst);
}
@@ -817,7 +815,7 @@
getModel().getRoutes(), observation, true);
int routeIndex = getModel().indexOfRoutes(route);
- ui.getRouteTable().getSelectionModel().setSelectionInterval(routeIndex, routeIndex);
+ SammoaUtil.selectTableRow(ui.getRouteTable(), routeIndex);
}
private PropertyChangeListener observationTimeChangeListener = new PropertyChangeListener() {
@@ -847,7 +845,7 @@
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- Observation observation = model.getBean(row);
+ Observation observation = model.getBean(table.convertRowIndexToModel(row));
Route route = Routes.findWithObservation(model.getFlightUIModel().getRoutes(), observation, true);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/AbstractRowHighlightPredicate.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/AbstractRowHighlightPredicate.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/AbstractRowHighlightPredicate.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -49,8 +49,8 @@
@Override
public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
- int columnIndex = adapter.column;
- int rowIndex = adapter.row;
+ int columnIndex = adapter.convertColumnIndexToModel(adapter.column);
+ int rowIndex = adapter.convertRowIndexToModel(adapter.row);
Object object = getValueAt(rowIndex);
boolean result;
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -94,14 +94,40 @@
}
((AbstractTableModel) table.getModel()).fireTableRowsUpdated(firstIndex, lastIndex);
if (scrollToFirst) {
- table.scrollRowToVisible(firstIndex);
+ table.scrollRowToVisible(table.convertRowIndexToView(firstIndex));
}
}
}
+ /**
+ * Select the row with the model {@code index} in given {@code table}.
+ *
+ * @param table Jtable to select the row
+ * @param index Model index to select
+ */
+ public static void selectTableRow(JTable table, int index) {
+ int viewIndex = table.convertRowIndexToView(index);
+ table.setRowSelectionInterval(viewIndex, viewIndex);
+ }
+
+ public static int getLastSelectedTableRow(JTable table) {
+ int result;
+ int nbRows = table.getSelectedRows().length;
+ if (nbRows > 0) {
+ int lastRow = table.getSelectedRows()[nbRows - 1];
+ result = table.convertRowIndexToModel(lastRow);
+
+ } else {
+ // No line selected
+ result = -1;
+ }
+ return result;
+ }
+
public static <T> TableSelectionListener<T> addTableSelectionListener(JTable table,
SelectionModelAdapter<T> selectionModelAdapter) {
- TableSelectionListener<T> result = new TableSelectionListener<T>(selectionModelAdapter);
+ TableSelectionListener<T> result =
+ new TableSelectionListener<T>(table, selectionModelAdapter);
table.getSelectionModel().addListSelectionListener(result);
return result;
}
@@ -305,17 +331,4 @@
JOptionPane.YES_NO_OPTION);
return i == JOptionPane.YES_OPTION;
}
-
- public static int getLastSelectedRow(JTable table) {
- int result;
- int nbRows = table.getSelectedRows().length;
- if (nbRows > 0) {
- result = table.getSelectedRows()[nbRows - 1];
-
- } else {
- // No line selected
- result = -1;
- }
- return result;
- }
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-04 12:47:21 UTC (rev 513)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-04 12:48:41 UTC (rev 514)
@@ -27,6 +27,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@@ -41,9 +42,13 @@
private static final Logger logger = LoggerFactory.getLogger(TableSelectionListener.class);
+ protected JTable table;
+
protected SelectionModelAdapter<T> selectionModelAdapter;
- public TableSelectionListener(SelectionModelAdapter<T> selectionModelAdapter) {
+ public TableSelectionListener(JTable table,
+ SelectionModelAdapter<T> selectionModelAdapter) {
+ this.table = table;
this.selectionModelAdapter = selectionModelAdapter;
}
@@ -64,11 +69,11 @@
} else if (listSelectionModel.isSelectedIndex(firstIndex)) {
// use first index
- newSelectedRow = firstIndex;
+ newSelectedRow = table.convertRowIndexToModel(firstIndex);
} else if (listSelectionModel.isSelectedIndex(lastIndex)) {
// use last index
- newSelectedRow = lastIndex;
+ newSelectedRow = table.convertRowIndexToModel(lastIndex);
}
List<T> elements = selectionModelAdapter.getElements();
T element = null;
@@ -78,7 +83,7 @@
element = elements.get(newSelectedRow);
if (logger.isInfoEnabled()) {
- logger.info("Select {} from index {}",
+ logger.info("Select {} at model index {}",
element.getClass().getSimpleName(), newSelectedRow);
}
1
0
r513 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/resources/i18n sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action
by fdesbois@users.forge.codelutin.com 04 Sep '12
by fdesbois@users.forge.codelutin.com 04 Sep '12
04 Sep '12
Author: fdesbois
Date: 2012-09-04 14:47:21 +0200 (Tue, 04 Sep 2012)
New Revision: 513
Url: http://forge.codelutin.com/repositories/revision/sammoa/513
Log:
refs #1372 : issue on delete transect + add shortcut config
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-09-03 17:31:14 UTC (rev 512)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-09-04 12:47:21 UTC (rev 513)
@@ -76,6 +76,8 @@
public static final String PROPERTY_CIRCLE_BACK = "circleBack";
+ public static final String PROPERTY_VALID_TRANSECT = "validTransect";
+
public static final String PROPERTY_VALID_ROUTE = "validRoute";
public static final String PROPERTY_VALID_OBSERVATION = "validObservation";
@@ -464,6 +466,13 @@
false,
false),
+ KEY_VALID_TRANSECT("ui." + PROPERTY_VALID_TRANSECT,
+ n_("sammoa.config.ui.validTransect"),
+ "alt pressed T",
+ KeyStroke.class,
+ false,
+ false),
+
KEY_VALID_ROUTE("ui." + PROPERTY_VALID_ROUTE,
n_("sammoa.config.ui.validRoute"),
"alt pressed R",
Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
===================================================================
--- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-09-03 17:31:14 UTC (rev 512)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-09-04 12:47:21 UTC (rev 513)
@@ -33,6 +33,7 @@
sammoa.config.ui.stop=Stop
sammoa.config.ui.validObservation=Validate the selected observation
sammoa.config.ui.validRoute=Validate the selected route
+sammoa.config.ui.validTransect=Validate the selected transect
sammoa.dateTimePattern=dd/MM/yyyy HH\:mm\:ss
sammoa.dbf.import.error.unableToReadField=impossible to read value for column %s at line %s
sammoa.flight.decorator.flight=Flight %1$d
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java 2012-09-03 17:31:14 UTC (rev 512)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java 2012-09-04 12:47:21 UTC (rev 513)
@@ -82,7 +82,7 @@
TransectFlight transectFlightChanged =
getValidationService().validateTransectFlight(getModel().getFlight(), transectFlight);
- if (transectFlightChanged.isDeleted()) {
+ if (transectFlightChanged == null) {
getModel().removeTransectFlight(index);
} else {
1
0
r512 - in trunk/sammoa-ui-swing/src/main: java/fr/ulr/sammoa/ui/swing/io/input/application resources/i18n
by fdesbois@users.forge.codelutin.com 03 Sep '12
by fdesbois@users.forge.codelutin.com 03 Sep '12
03 Sep '12
Author: fdesbois
Date: 2012-09-03 19:31:14 +0200 (Mon, 03 Sep 2012)
New Revision: 512
Url: http://forge.codelutin.com/repositories/revision/sammoa/512
Log:
fixes #1448 : add column to indicate flight exist
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java 2012-09-03 15:47:49 UTC (rev 511)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java 2012-09-03 17:31:14 UTC (rev 512)
@@ -41,19 +41,19 @@
protected final List<FlightImportEntry> data;
- protected final boolean canSelect;
+ protected final boolean campaignExist;
- protected Class<?>[] COLUMN_TYPES = {String.class, Boolean.class};
+ protected Class<?>[] COLUMN_TYPES = {String.class, Boolean.class, Boolean.class};
- public FlightTableModel(List<FlightImportEntry> data, boolean canSelect) {
+ public FlightTableModel(List<FlightImportEntry> data, boolean campaignExist) {
Preconditions.checkNotNull(data);
this.data = data;
- this.canSelect = canSelect;
+ this.campaignExist = campaignExist;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
- return canSelect && columnIndex == 1;
+ return campaignExist && columnIndex == 2;
}
@Override
@@ -68,7 +68,7 @@
@Override
public int getColumnCount() {
- return canSelect ? 2 : 1;
+ return campaignExist ? 3 : 1;
}
@Override
@@ -83,6 +83,9 @@
result = flightImportEntry.getFlightStorage().getName();
break;
case 1:
+ result = flightImportEntry.getExistingFlight() != null;
+ break;
+ case 2:
result = flightImportEntry.isTreat();
break;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-09-03 15:47:49 UTC (rev 511)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-09-03 17:31:14 UTC (rev 512)
@@ -342,6 +342,8 @@
table,
n_("sammoa.importApplication.flightTable.column.flightName"),
n_("sammoa.importApplication.flightTable.column.flightName.tip"),
+ n_("sammoa.importApplication.flightTable.column.flightExist"),
+ n_("sammoa.importApplication.flightTable.column.flightExist.tip"),
n_("sammoa.importApplication.flightTable.column.toTreat"),
n_("sammoa.importApplication.flightTable.column.toTreat.tip"));
} else {
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-03 15:47:49 UTC (rev 511)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-03 17:31:14 UTC (rev 512)
@@ -92,6 +92,8 @@
sammoa.flightPanel.table.column.position.left=Left
sammoa.flightPanel.table.column.position.navigator=Nav
sammoa.flightPanel.table.column.position.right=Right
+sammoa.importApplication.flightTable.column.flightExist=Flight exist
+sammoa.importApplication.flightTable.column.flightExist.tip=Flight exist
sammoa.importApplication.flightTable.column.flightName=Flight name
sammoa.importApplication.flightTable.column.flightName.tip=Flight name
sammoa.importApplication.flightTable.column.toTreat=Select
1
0