/* This file is part of Wattzap Community Edition. * * Wattzap Community Edtion 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. * * Wattzap Community Edition 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 Wattzap. If not, see <http://www.gnu.org/licenses/>. */ package com.wattzap; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Toolkit; import java.io.IOException; import java.util.HashMap; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; import javax.swing.WindowConstants; import net.miginfocom.swing.MigLayout; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import com.omniscient.log4jcontrib.swingappender.SwingAppender; import com.sun.jna.NativeLibrary; import com.wattzap.model.UserPreferences; import com.wattzap.model.ant.AdvancedSpeedCadenceListener; import com.wattzap.model.ant.Ant; import com.wattzap.model.ant.AntListener; import com.wattzap.model.ant.CadenceListener; import com.wattzap.model.ant.DummySpeedCadenceListener; import com.wattzap.model.ant.HeartRateListener; import com.wattzap.model.ant.PowerListener; import com.wattzap.model.ant.SpeedListener; import com.wattzap.view.AntOdometer; import com.wattzap.view.ControlPanel; import com.wattzap.view.MainFrame; import com.wattzap.view.Map; import com.wattzap.view.Odometer; import com.wattzap.view.Profile; import com.wattzap.view.VideoPlayer; /** * Main entry point * * (c) 2013-2016 David George / Wattzap.com * * @author David George * @date 11 June 2013 */ public class Main implements Runnable { private static Logger logger = LogManager.getLogger("Main"); private final static UserPreferences userPrefs = UserPreferences.INSTANCE; public static void main(String[] args) { // Debug Level level = setLogLevel(); // hard coded for debugging, not important, normally libvlc is found on // lib path NativeLibrary.addSearchPath("libvlc", "."); // configure the appender String PATTERN = "%r [%t] %p %c %x %m%n"; String logFile = userPrefs.getWD() + "/logfile.txt"; FileAppender fileAppender; try { fileAppender = new FileAppender(new PatternLayout(PATTERN), logFile); fileAppender.setThreshold(level); fileAppender.activateOptions(); // add appender to any Logger (here is root) Logger.getRootLogger().addAppender(fileAppender); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // create appender if (args.length > 0) { for (String s: args) { if ("-R".equals(s)) { UserPreferences.INSTANCE.factoryReset(); } } } // Turn on Debug window if (userPrefs.isDebug()) { SwingAppender appender = new SwingAppender(); // create appender // configure the appender appender.setLayout(new PatternLayout(PATTERN)); appender.setThreshold(level); appender.activateOptions(); // add appender to any Logger (here is root) Logger.getRootLogger().addAppender(appender); } logger.info("Setting log level => " + level.toString()); logger.info("Database Version " + userPrefs.getDBVersion()); try { for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } } //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); EventQueue.invokeLater(new Main()); } catch (Exception e) { // catch everything and log logger.error(e.getLocalizedMessage()); userPrefs.shutDown(); } } @Override public void run() { MainFrame frame = new MainFrame(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // frame.setSize(screenSize.width, screenSize.height-100); frame.setBounds(userPrefs.getMainBounds()); // Must be declared above Odometer // AdvancedSpeedCadenceListener scListener = null; JPanel odo = null; try { HashMap<String, AntListener> antListeners = new HashMap<String, AntListener>(); int id = userPrefs.getSCId(); if (id > 0) { AntListener listener = new AdvancedSpeedCadenceListener(); antListeners.put(listener.getName(), listener); } id = userPrefs.getSpeedId(); if (id > 0) { AntListener listener = new SpeedListener(); antListeners.put(listener.getName(), listener); } id = userPrefs.getCadenceId(); if (id > 0) { AntListener listener = new CadenceListener(); antListeners.put(listener.getName(), listener); } id = userPrefs.getHRMId(); if (id > 0) { AntListener listener = new HeartRateListener(); antListeners.put(listener.getName(), listener); } id = userPrefs.getPowerId(); if (id > 0) { AntListener listener = new PowerListener(); antListeners.put(listener.getName(), listener); } new Ant(antListeners).register(); odo = new AntOdometer(); } catch (Exception e) { JOptionPane.showMessageDialog(frame, "ANT+ " + e.getMessage(), userPrefs.getString("warning"), JOptionPane.WARNING_MESSAGE); logger.error("ANT+ " + e.getMessage()); new DummySpeedCadenceListener(); userPrefs.setAntEnabled(false); odo = new Odometer(); } // Performs an isregister check, be careful if we move below AboutPanel VideoPlayer videoPlayer = new VideoPlayer(frame, odo); try { videoPlayer.init(); } catch (Exception e) { JOptionPane.showMessageDialog(frame, e.getMessage(), userPrefs.getString("warning"), JOptionPane.INFORMATION_MESSAGE); logger.info(e.getMessage()); videoPlayer = null; } MigLayout layout = new MigLayout("center", "[]10px[]", ""); Container contentPane = frame.getContentPane(); contentPane.setBackground(Color.BLACK); contentPane.setLayout(layout); // create view new Map(frame); Profile profile = new Profile(screenSize); profile.setVisible(false); // Menu Bar new MenuBar(frame); frame.add(profile, "cell 0 1, grow"); // by default add to telemetry frame frame.add(odo, "cell 0 2, grow"); ControlPanel cp = new ControlPanel(); frame.add(cp, "cell 0 3"); frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); // frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } private static Level setLogLevel() { final String LOGGER_PREFIX = "log4j.logger."; for (String propertyName : System.getProperties().stringPropertyNames()) { if (propertyName.startsWith(LOGGER_PREFIX)) { String loggerName = propertyName.substring(LOGGER_PREFIX .length()); String levelName = System.getProperty(propertyName, ""); Level level = Level.toLevel(levelName); // defaults to DEBUG if (!"".equals(levelName) && !levelName.toUpperCase().equals(level.toString())) { logger.error("Skipping unrecognized log4j log level " + levelName + ": -D" + propertyName + "=" + levelName); continue; } return level; } } return Level.ERROR; } }