Compare commits

...

77 Commits

Author SHA1 Message Date
Peter Johnson
8801568325 DriverStation::GetJoystickName(): Make work for stick>0.
Change-Id: I1c62742cf8b80c81d21c2198f966c8151a758a01
2016-01-15 10:45:20 -08:00
Brad Miller (WPI)
6adf4c48cd Merge "Fix HALGetJoystickDescriptor()." 2016-01-15 08:44:03 -08:00
Brad Miller (WPI)
026c427a2b Merge "Fixed Simulation C++ API" 2016-01-15 08:43:31 -08:00
Peter_Mitrano
63878d8ab7 Fixed Simulation C++ API
Fixed API in the following classes:
 - RobotDrive
 - AnalogGyro

moved some files from Athena the shared that are independant of platform
Renamed Gyro to AnalogGyro
added smart pointer constructors to RobotDrive

Change-Id: If8a1bde5aed77fd60869d1993c302dd519bc8848
2016-01-15 11:26:16 -05:00
Peter Johnson
83f902f2f6 Fix HALGetJoystickDescriptor().
This reverts the previous commit instead fixing it at the root
HALGetJoystickDescriptor function, which also fixes use of that function
by the C++ DriverStation class.

Change-Id: I1f203a015d8f10d119c61635def2822bf124754c
2016-01-14 21:49:50 -08:00
Thad House
f79ed1ab44 Artf4800: Fixes HALGetJoystick*** Segfault
The HALGetJoystick*** methods were not initializing the descriptor
variable properly. This was causing a SegFault if joysticks were moved
around while one of these methods were running.

Change-Id: If804c7ea724b10381765068e4d6fad75fad69ecb
2016-01-14 11:19:51 -08:00
Brad Miller (WPI)
bf89762e82 Merge "fix sim_ds launch script" 2016-01-13 10:19:40 -08:00
Brad Miller (WPI)
bd1e091629 Merge "Added build dir specification for sim javadoc to not overwrite athena javadoc" 2016-01-13 10:17:15 -08:00
Fredric Silberberg
2662a7ab0d Initialized the m_sensors variable to fix artf4798.
Change-Id: Iab7b76c0e36b3a8e5ab764f7dcd6772a2058bd0f
2016-01-12 16:27:34 -05:00
Fredric Silberberg
713d54fd2f Added build dir specification for sim javadoc to not overwrite athena javadoc
Change-Id: Idcc1303628134dd37c6c178b0bd66cfe2d24f928
2016-01-11 22:26:25 -05:00
Peter_Mitrano
75a07fc3e4 fix sim_ds launch script
It seems the tilde character doesn't always resolve to the home
directory

Change-Id: I69ecbab266901b271a16ce81b60a8bf7873f8a20
2016-01-08 01:31:01 -05:00
Peter Johnson
6b740e87b3 Fix C++ PIDController SetToleranceBuffer and OnTarget locking.
Also implement OnTarget fix in simulation PIDController.

Change-Id: Ic4b452759f80aa769a721f22cb6e732c2a9a213a
2016-01-07 20:55:10 -08:00
Brad Miller (WPI)
ac27f4b644 Merge "Fix onTarget() so that it returns false until there are any values retrieved" 2016-01-07 09:25:52 -08:00
Brad Miller
99b6000a65 Fix onTarget() so that it returns false until there are any values retrieved
The onTarget() method uses the average error and there might not be a valid value
until the PIDController runs once. This is causing commands to bail out early in
simulation.

Change-Id: I7bac9ecb847cbe4f378385b1a6998bba10147554
2016-01-07 12:03:17 -05:00
Peter Johnson
628811ed03 Correctly set smart dashboard type for AnalogGyro and ADXRS450_Gyro.
The GetSmartDashboardType() function defined by GyroBase was returning the
correct "Gyro", but the overrides in AnalogGyro and ADXRS450_Gyro were
incorrectly changing this, resulting in SmartDashboard not recognizing these
as being gyros.

Additionally, AddSensor in the C++ AnalogGyro was setting the name to Gyro
rather than AnalogGyro.

Change-Id: Ib2e31cd2712cc2bc26c8082ed760175d0ee80fb6
2016-01-06 20:45:47 -08:00
Brad Miller (WPI)
c57e749a94 Merge "Fixed sim_ds script library path" 2016-01-06 14:41:44 -08:00
Brad Miller (WPI)
3350926d26 Merge "PIDController feed forward term can now be calculated by the end user" 2016-01-06 14:38:59 -08:00
Peter_Mitrano
4dec393c2d Fixed sim_ds script library path
Change-Id: I12fe435ea397cbcaf5da5b214c36ef5f76eb88cb
2016-01-06 00:14:11 -05:00
Brad Miller (WPI)
0e9f07d1c2 Merge "Fixing install script... again" 2016-01-05 19:30:43 -08:00
Peter Johnson
5765b13976 Use absolute path for NT persistent storage.
Fixes artf4782.

Change-Id: I34c142b3e17e2ba26cff429ceb771e30196f9bfd
2016-01-05 19:20:16 -08:00
Peter_Mitrano
2d43048807 Fixing install script... again
apparently `ln -sf` does not overwrite existing symlinks
so we use `rm -f` first, then use `ls -s`

Change-Id: I033839e50b942cc3508004c84837e9090f1b4f5c
2016-01-05 16:45:22 -05:00
Tyler Veness
e3ce991f18 PIDController feed forward term can now be calculated by the end user
The current feed forward calculation is only useful for velocity PID controllers where F, the feed forward constant, is 1 over the maximum setpoint for the output. For motion profiles which use position PID controllers, the appropriate calculation for velocity and acceleration feed forwards is different. This change allows the user to provide their own feed forward implementation without having to rewrite the entire Calculate() function.

Both default feed forward calculations are velocity feed forwards. Suggestions for sensible feed forward constants are included in the inline comments.

Change-Id: Id175786f26bd342de52a1fae89595cbeba5dfc93
2016-01-05 10:52:25 -08:00
Tyler Veness
3cd1253977 artf2612: Update license in source files.
Years update, references to WIND_BASE were removed, and WPILib license was
moved to the root directory of the project.

If there was already a comment block, a year range through 2016 was created
using the first year in the comment. If there was no comment block, a block
with just the year 2016 was added.

Comments were not added to files from external sources (NI, CTRE).

Change-Id: Iff4f098ab908b90b8d929902dea903de2f596acc
2016-01-05 00:35:05 -08:00
Peter Johnson (294)
008fb2e382 Merge "Removed gz_msgs from wpilibcSim" 2016-01-04 23:22:07 -08:00
Tyler Veness
887f220fe7 Ultrasonic: replace linked list with std::set.
Also remove m_mutex.  It's no longer necessary because we ensure the automatic
thread is stopped while the set is being accessed.

Change-Id: I5994bbeba022a2ebd9e166fca369ebc8c229975c
2016-01-04 22:52:35 -08:00
Peter_Mitrano
dd19778152 Removed gz_msgs from wpilibcSim
it's not directly required to link at this time, and if you want to use a different
version of protobuf on the end-user's computer then linking their robot programs
will fail

Change-Id: I9ad7c07a17b7a332b4027adbe71be605e415bc2d
2016-01-04 22:50:21 -05:00
Peter Johnson (294)
7a2be548a7 Merge "Replaced linked list in Notifier with std::list" 2016-01-04 19:49:55 -08:00
Peter Johnson (294)
5f93009661 Merge "Renamed Gyro to AnalogGyro to match athena API" 2016-01-04 19:33:40 -08:00
Tyler Veness
d77f5c8019 Replaced linked list in Notifier with std::list
Change-Id: I3bcb1195102d792db994dba98adc7425767b16e8
2016-01-04 19:13:52 -08:00
Peter_Mitrano
6faa51ff48 Renamed Gyro to AnalogGyro to match athena API
Removed references to HAL classes, enabling moving of these classes into
shared.

Change-Id: I8d9053e1046d6fc2a60e13fb29410fd2c95180d2
2016-01-04 19:09:51 -08:00
Peter Johnson (294)
ce2245110b Merge "Adds CANTalon to LiveWindow" 2016-01-04 14:38:31 -08:00
Brad Miller (WPI)
dfba97a540 Merge "Fixing the frcsim installer script" 2016-01-04 13:41:20 -08:00
Thad House
99b2b65148 Adds CANTalon to LiveWindow
CANTalon was not being added to the LiveWindow list.

Change-Id: I732bb65a899f11bb9b1ef0a7320f0f0cc78233f7
2016-01-04 12:28:27 -08:00
Peter Johnson (294)
5976baec02 Merge "Fixes CAN devices in C++ library not showing in the livewindow" 2016-01-04 12:08:49 -08:00
Peter Johnson
932ec8e302 Merge "HAL: Use extern "C" in implementation files." 2016-01-04 11:58:44 -08:00
Sam Carlberg
1c6fe85a7b Fixes CAN devices in C++ library not showing in the livewindow
Change-Id: I47a9d6370b4b2573272881258d4bb46aa149bed0
2016-01-04 11:48:31 -08:00
Tyler Veness
e15ca5a414 Added linear digital filters
Linear digital filter class based on code from FRC team 341

Change-Id: I4c5198e36a089e08a6d054bf1bf80392def27e23
2016-01-03 23:05:49 -08:00
Peter_Mitrano
70bc630f1f Fixing the frcsim installer script
URL for simulation zip changed as of gerrit 1264
script argument name changed from INSTALLER to INSTALL
fixed jar and logo paths for sim_ds

to use the script, it's now simply:
./frcsim-installer.sh INSTALL

You can optionally supply a promotion status from which to install, such as
./frcsim-installer.sh INSTALL beta
./frcsim-installer.sh INSTALL development

Also added some information to the README

Also allow any type of file install-resources since it may contain
libraries and jars

Change-Id: Ie876a05c88d3d48b8592f1800959988ae66edd04
2016-01-03 02:05:22 -05:00
Brad Miller (WPI)
6c89f34e44 Merge "Default bufLength for PIDController in Java should be 1" 2016-01-02 19:09:58 -08:00
Peter Johnson (294)
d542fe4293 Merge "Adds WaitResult to Java waitForInterrupt" 2016-01-02 09:54:57 -08:00
Peter Johnson
351e8599ac HAL: Use extern "C" in implementation files.
This turns accidental parameter mismatches between header and implementation
into compiler errors.

Change-Id: Ic26fabb82b2fd5f79407a11435cdbd35348af15f
2016-01-02 09:49:35 -08:00
Dustin Spicuzza
31a39b4e59 Default bufLength for PIDController in Java should be 1
- cpp version defaults to 1
- Documentation in getAvgError() says it defaults to 1

Change-Id: Id45f345f048f4c02709745ec1fb97744b7af7715
2016-01-02 12:00:40 -05:00
Peter Johnson
e2ec34090a Keep track of FPGA time rollovers with 64-bit time.
This allows both greater than 72 minute (2^32 * 1 us) timeouts and also
gracefully handles notifiers across the FPGA time counter rollover.

Change-Id: Ibde0b903155f60b618b0ca4d5f8f6dd49f90b020
2016-01-02 06:29:59 -08:00
Brad Miller (WPI)
063925e737 Merge "Change C++ Notifier to allow std::function callback." 2016-01-02 06:29:20 -08:00
Brad Miller (WPI)
de4708cbdb Merge "Rewrite C++ Notifier to use HAL multi-notifier support." 2016-01-02 06:28:40 -08:00
Brad Miller (WPI)
8bbc1d43bb Merge "Rewrite Java Notifier and update Interrupt JNI." 2016-01-02 06:27:44 -08:00
Peter Johnson (294)
c01146eb02 Merge "Readded styleguide accidentally removed in the reorg" 2016-01-01 20:09:33 -08:00
Peter Johnson (294)
3e71573c51 Merge "Artf4179: Allow alternate I2C addresses for ADXL345_I2C" 2016-01-01 19:34:47 -08:00
Fredric Silberberg
5bc6e1378c Readded styleguide accidentally removed in the reorg
Change-Id: I240516c2c62d056e6ea4c31026918f5414c6a710
2016-01-01 19:32:33 -08:00
Tyler Veness
5cee85f921 Fixed some typos in the comments of MotorEncoderFixture.java, a method name in CANMotorEncoderFixture.java, and the README files
Change-Id: I87d982068f3e7cdcce6e5b06c34a7ef326f5eae0
2016-01-01 16:19:53 -08:00
Thad House
951c81f5b7 Adds WaitResult to Java waitForInterrupt
WaitResult gets returned from C++ and the JNI, so should probably be returned
in Java as well.

Adds WaitResult tests to Java AbstractInterruptTest

Change-Id: Ic3cb2919652696c458c39006b2f716301c0736f4
2016-01-01 11:20:59 -08:00
Joe Ross
75d1891a57 Artf4177: Use read byte count for ReadString
Change-Id: Id27a60553792bf668b5c653b889449e695aebdc6
2015-12-31 19:44:53 -08:00
Joe Ross
376fc6be6f Artf4179: Allow alternate I2C addresses for ADXL345_I2C
Change-Id: I43e65251b4a7a5b90afb698b753b86672110e837
2015-12-31 17:51:16 -08:00
Peter Johnson
91a451f87a Change C++ Notifier to allow std::function callback.
Also provide templated varags constructor for backwards compatibility and
ease of use.

Update PIDController to use new constructor, eliminating static function
CallCalculate().

Change-Id: Iaeae95aa5953f294f5debc5fc569ef6d4684f223
2015-12-29 18:33:29 -08:00
Peter Johnson
b0de0b7386 Rewrite C++ Notifier to use HAL multi-notifier support.
This removes redundant queue code from the C++ library.

The old queue code is still needed by simulation, and as the delta between
the simulation and athena headers has grown significantly, this splits the
header into two separate files.

Change-Id: Ia76b38337a25eb9d4890b3eb9bd76b1cbda7f285
2015-12-29 18:33:29 -08:00
Peter Johnson
5dc5ed83b3 Rewrite Java Notifier and update Interrupt JNI.
Notifier takes advantage of the multi-notifier support now in HAL.

Each Notifier is now handled by a separate thread at the JNI level, so
one notifier taking longer to process (or being breakpointed) does not
stop the other notifiers from running.  These threads are configured as
daemon threads.

In both Notifier and Interrupt JNI, the JNI thread attachment no longer
repeatedly calls AttachCurrentThread().  This improves performance but more
importantly avoids impacting the Eclipse debugger, which attempts to
track each call to AttachCurrentThread() as a separate Java thread.

Note: There is currently no way to free an interrupt handler.  Repeatedly
calling attachInterruptHandler() will result in leaking previous handlers.

Change-Id: Ib12e3df88943c03e0269d3906e5b153767139391
2015-12-29 18:33:22 -08:00
Brad Miller (WPI)
fe01096e7a Merge "finishing up FRCSim installer" 2015-12-29 14:25:28 -08:00
Peter_Mitrano
acc7fbbf01 finishing up FRCSim installer
adds build of gz_msgs on end-user computer
This means we don't need to provide different zips for different
versions of ubuntu.
The problem was that gazebo on 14.04 comes with protobuf 2.5 but gazebo on 15.10 comes with 2.6
added a few other fixes to the install script as well

also fix dependency between simluation publishing and libwpilibcsim
building

Change-Id: I57d5a26ed7795bc61a25402e2986c6023d1d78ac
2015-12-29 13:48:59 -05:00
Peter Johnson (294)
416a238bed Merge "Artf4776 Fixes First DIO PWM usage errors" 2015-12-29 08:23:56 -08:00
Peter Johnson (294)
3d2b54a1c0 Merge "Artf4774 Fixes HAL getHALErrorMessage missing error" 2015-12-28 18:39:44 -08:00
Brad Miller (WPI)
ae99eb6761 Merge "Prevent double free in DigitalGlitchFilter" 2015-12-28 18:33:36 -08:00
Brad Miller (WPI)
e2fb1c6d46 Merge "Set correct error message" 2015-12-28 18:30:08 -08:00
Dustin Spicuzza
4881795a92 Prevent double free in DigitalGlitchFilter
Change-Id: Icf9660762c78054895bf8e86a6dfae0615288de6
2015-12-28 21:11:29 -05:00
Peter_Mitrano
17b363f3b4 working on install process for FRCSim 2016
To publish the simulation zip, run ./gradlew publish -PmakeSim

Targeting Ubuntu 14.04 and 15.10 for now, with 14.04 being the
currently best supported.
Two scripts have been drafted for installing, for 14.04 and 15.10
It currently publishes to ~/releases/maven/development/simulation

There is a known bug that gz_msgs for 15.10 must be built using
protobuf 2.6, which is not the default on 14.04.

Change-Id: I6cccd601671553d30fd05bbbc79c2b7dc1efbf1d
2015-12-28 16:42:24 -05:00
Brad Miller (WPI)
85c3e6a4fd Merge "This commit adds documentation generation, including grabbing ntcore sources, for both Java and C++. This will need changes made in the wpilib promotion tasks to copy the generatd documentation to the correct places." 2015-12-25 20:45:12 -08:00
Peter_Mitrano
2c04cf135b Improved READMEs
fixed a few incorrect statements
added structure and organization to main README to help people find
stuff when they're first starting

Change-Id: I6148f2e9bc63cbeaf5f2e40566bf9d274ed36aaa
2015-12-25 21:16:00 -05:00
thouse
dbba4a1036 Artf4776 Fixes First DIO PWM usage errors
Adds Java and C++ integration tests for testing DIO PWM

Change-Id: Iae32b57636a9648b92e8e0520f6cbba4c3c377ca
2015-12-25 08:34:43 -08:00
Brad Miller
083c90d377 Added libnipalu to make vision programs link properly
Change-Id: Ib45dbc2944f80bba1063cbd7c7875d3cf215584b
2015-12-24 21:35:31 -05:00
Fredric Silberberg
729545809e This commit adds documentation generation,
including grabbing ntcore sources, for both
Java and C++. This will need changes made in
the wpilib promotion tasks to copy the generatd
documentation to the correct places.

Change-Id: I64590b5eda001da2cc8ae498b2b1c0fd298da284
2015-12-24 14:43:51 -05:00
Dustin Spicuzza
842aba97b8 Set correct error message
Change-Id: Ieed132ec95568b4c01dce9c59feaa36eda4c56dc
2015-12-24 01:05:08 -05:00
thouse
d3f4400035 Artf4774 Fixes HAL getHALErrorMessage missing error
Change-Id: Ie0686363939f4be389f1dc284bb2a68f2783836d
2015-12-23 11:00:20 -08:00
Peter_Mitrano
20749ed6e9 Condition java sim build on -PmakeSim flag
This prevents issues building wpilib if you have ntcore but haven't
built desktop
If you want to build sim, use -PmakeSim
This will require the desktop build of ntcore, which can be done with:
./gradlew build publish -PmakeDesktop

Change-Id: I20f379267a226dbdfcff8fe6223670257725965a
2015-12-23 10:38:51 -08:00
Peter Johnson (294)
684da8d89f Merge "Add SPARK and SD540 motor controllers" 2015-12-21 10:24:05 -08:00
Austin Schuh
13496c75b4 Fixed double free of DriverStation.
DriverStation was being added to the singletons and also as a const
member variable.  This made it so that on program exit, it was
getting double freed.

Change-Id: I87f8260615dc31d57ce7c7204c1dfde22973ad51
2015-12-20 16:15:24 -08:00
Peter_Mitrano
d69803804f Repaired simulation build on linux
Reverted to old driverstation and joystick code because we're not ready
for windows drive station yet

updated paths to reflect new wpilib organization
fixed name of gazebo topic (if you want /gazebo/frc/time use ~/time)
included network tables in wpilibJavaSim
Added ds script, and improved frcsim script
always start gazebo with verbose

Change-Id: I3c54b7000019a5985079a88200896a8069e69b86
2015-12-19 14:42:43 -05:00
Peter_Mitrano
0d062fba3a Add Cmake wrappers and unzip desktop ntcore builds
the task allcsim will build everything
requires ntcore desktop to be built
also fixed Driverstation to match non-sim C++ API

Conflicts:
	wpilibc/simulation/CMakeLists.txt

Change-Id: Id38141a5b48ed7fe064c7e6c8d2f618481b7e298
2015-12-18 22:29:57 -05:00
Kevin O'Connor
fa903dd9ce Add SPARK and SD540 motor controllers
Change-Id: I33f9c588b6d535b1f274d211563ef146f34439b1
2015-12-17 16:28:05 -05:00
706 changed files with 13919 additions and 3564 deletions

6
.gitignore vendored
View File

@@ -175,3 +175,9 @@ __pycache__
#catkin stuff
package.xml
# Doxygen stuff
NO
# Simulation folder stuff
!simulation/install_resources/*

View File

@@ -1,4 +1,4 @@
* Copyright (c) 2009 FIRST
* Copyright (c) 2009-2016 FIRST
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without

View File

@@ -5,27 +5,9 @@ include(CheckCXXCompilerFlag)
include (FindPkgConfig)
include(GNUInstallDirs)
#copied from GazeboUtils.cmake
macro (APPEND_TO_CACHED_STRING _string _cacheDesc)
FOREACH (newItem ${ARGN})
SET (${_string} "${${_string}} ${newItem}" CACHE INTERNAL ${_cacheDesc} FORCE)
ENDFOREACH (newItem ${ARGN})
endmacro (APPEND_TO_CACHED_STRING)
#check for depenedencies
find_package(gazebo REQUIRED)
find_package(Boost COMPONENTS system filesystem REQUIRED)
find_package(Protobuf REQUIRED)
if (NOT PROTOBUF_FOUND)
MESSAGE ("Missing: Google Protobuf (libprotobuf-dev)")
endif()
if (NOT PROTOBUF_PROTOC_EXECUTABLE)
MESSAGE ( "Missing: Google Protobuf Compiler (protobuf-compiler)")
endif()
if (NOT PROTOBUF_PROTOC_LIBRARY)
MESSAGE ("Missing: Google Protobuf Compiler Library (libprotoc-dev)")
endif()
#on windows we produce .dlls with no prefix
if(WIN32)
@@ -48,12 +30,10 @@ endif()
if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFRC_SIMULATOR /MDd /Zi")
else ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -DFRC_SIMULATOR -Wno-unused-parameter -pthread -fPIC -fpermissive")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++1y -DFRC_SIMULATOR -Wno-unused-parameter -pthread -fPIC -fpermissive")
endif()
include_directories("build")
add_subdirectory(simulation/gz_msgs)
add_subdirectory(wpilibc/simulation)
add_subdirectory(simulation/frc_gazebo_plugins)
add_subdirectory(ntcore)

View File

@@ -22,6 +22,24 @@ To build a specific subproject, such as wpilibc, you must access the subproject
./gradlew :wpilibc:build
```
If you also want simulation to be build, add -PmakeSim. This requires gazebo_transport. We have tested on 14.04 and 15.05, but any correct install of gazebo should work, even on windows if you build from source. Correct means cmake needs to be able to find gazebo-config.cmake, which you get for free with ubuntu installs.
```bash
./gradlew build -PmakeSim
```
C++ simulation tasks (including plugins, gz_msgs, and wpilibcSim) all depend on gazebo_transport. In order for this to build you must have installed gazebo. See [The Gazebo website](https://gazebosim.org/) for installation instructions.
If you prefer to use CMake directly, the you can still do so.
The common cmake tasks are wpilibcSim, frc_gazebo_plugins, and gz_msgs
```bash
mkdir build #run this in the root of allwpilib
cd build
cmake ..
make
```
The gradlew wrapper only exists in the root of the main project, so be sure to run all commands from there. All of the subprojects have build tasks that can be run. Gradle automatically determines and rebuilds dependencies, so if you make a change to the HAL and then run `:wpilibc:build`, the HAL will be rebuilt, then wpilibc.
There are a few tasks other than `build` available. To see them, run the meta-task `tasks`. This will print a list of all available tasks, with a description of each task.
@@ -42,3 +60,14 @@ The following maven targets a published by this task:
- edu.wpi.first.wpilibj:wpilibJavaSim:0.1.0-SNAPSHOT - Simulation Java
- edu.wpi.first.wpilibj.simulation:SimDS:0.1.0-SNAPSHOT - The driverstation for controlling simulation.
- org.gazebosim:JavaGazebo:0.1.0-SNAPSHOT - Gazebo protocol for Java.
## Structure and Organization
The main wpilib code you're probably looking for is in wpilibj and wpilibc. Those directories are split into shared, sim, and athena. Athena contains the wpilib code meant to run on your RoboRIO. Sim is wpilib code meant to run on your computer with gazebo, and shared is code shared between the two. Shared code must be platform-independent, since it will be compiled with both the ARM cross-compiler and whatever desktop compiler you are using (g++, msvc, etc...).
The Simulation directory contains extra simulation tools and libraries, such as gz_msgs and JavaGazebo. See sub-directories for more information.
The integration test directories for C++ and Java contain test code that runs on our test-system. When you submit code for review, it is tested by those programs. If you add new functionality you should make sure to write tests for it so we don't break it in the future.
The hal directory contains more C++ code meant to run on the RoboRIO. HAL is an acronym for "Hardware Abstraction Layer", and it interfaces with the NI Libraries. The NI Libraries contain the low-level code for controlling devices on your robot. The NI Libraries are found in the ni-libraries folder.
The styleguide directory contains the styleguide for C++ and Java code. Anything submitted to the wpilib project needs to follow the code style guides outlined in there.

View File

@@ -7,6 +7,8 @@ if (!hasProperty('repo')) {
def repoBaseUrl = "http://first.wpi.edu/FRC/roborio/maven/${repo}"
def publishUrl = "${System.getProperty('user.home')}/releases/maven/${repo}"
ext.simulationInstallDir = "$rootDir/build/install/simulation"
allprojects {
ext.enableSimulation = enableSimulation
ext.repo = repo
@@ -43,4 +45,4 @@ subprojects {
}
}
apply from: 'cppSettings.gradle'
apply from: 'cppSettings.gradle'

View File

@@ -19,11 +19,20 @@ niLibraryTree.each { lib ->
}
}
def ntDependency =
def armNtDependency =
project.dependencies.create("edu.wpi.first.wpilib.networktables.cpp:NetworkTables:3.0.0-SNAPSHOT:arm@zip")
def config = project.configurations.detachedConfiguration(ntDependency)
config.setTransitive(false)
def netTables = config.files[0].canonicalFile
def armConfig = project.configurations.detachedConfiguration(armNtDependency)
armConfig.setTransitive(false)
def armNetTables = armConfig.files[0].canonicalFile
def desktopNetTables
if (project.hasProperty('makeSim')){
def desktopNtDependency =
project.dependencies.create("edu.wpi.first.wpilib.networktables.cpp:NetworkTables:3.0.0-SNAPSHOT:desktop@zip")
def desktopConfig = project.configurations.detachedConfiguration(desktopNtDependency)
desktopConfig.setTransitive(false)
desktopNetTables = desktopConfig.files[0].canonicalFile
}
def netTablesUnzipLocation = "$buildDir/networktables"
@@ -31,7 +40,10 @@ def netTablesUnzipLocation = "$buildDir/networktables"
task unzipNetworkTables(type: Copy) {
description = 'Unzips the networktables maven dependency so that the include files and libraries can be used'
group = 'WPILib'
from zipTree(netTables)
if (project.hasProperty('makeSim')){
from zipTree(desktopNetTables)
}
from zipTree(armNetTables)
into netTablesUnzipLocation
}
@@ -47,9 +59,12 @@ subprojects {
ext.defineNetworkTablesProperties = {
ext.netTables = netTablesUnzipLocation
ext.netTablesInclude = "$netTablesUnzipLocation/include"
ext.netLibLocation = "$netTablesUnzipLocation/Linux/arm"
ext.netSharedLib = "$netLibLocation/libntcore.so"
ext.netStaticLib = "$netLibLocation/libntcore.a"
ext.netLibArmLocation = "$netTablesUnzipLocation/Linux/arm"
if (project.hasProperty('makeSim')){
ext.netLibDesktopLocation = "$netTablesUnzipLocation/Linux/amd64"
}
ext.netSharedLib = "$netLibArmLocation/libntcore.so"
ext.netStaticLib = "$netLibArmLocation/libntcore.a"
task addNetworkTablesLibraryLinks() {
description = 'Adds the linker flags for the networktables libraries retreived from maven'

View File

@@ -222,7 +222,7 @@ extern "C"
uint16_t getFPGAVersion(int32_t *status);
uint32_t getFPGARevision(int32_t *status);
uint32_t getFPGATime(int32_t *status);
uint64_t getFPGATime(int32_t *status);
bool getFPGAButton(int32_t *status);

View File

@@ -4,8 +4,9 @@
extern "C"
{
void* initializeNotifier(void (*ProcessQueue)(uint32_t, void*), void* param, int32_t *status);
void* initializeNotifier(void (*process)(uint64_t, void*), void* param, int32_t *status);
void cleanNotifier(void* notifier_pointer, int32_t *status);
void updateNotifierAlarm(void* notifier_pointer, uint32_t triggerTime, int32_t *status);
void* getNotifierParam(void* notifier_pointer, int32_t *status);
void updateNotifierAlarm(void* notifier_pointer, uint64_t triggerTime, int32_t *status);
void stopNotifierAlarm(void* notifier_pointer, int32_t *status);
}

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
typedef struct port_t

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
/* std::condition_variable provides the native_handle() method to return its

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
// Allows usage with std::lock_guard without including <mutex> separately

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Accelerometer.hpp"
#include "ChipObject.h"
@@ -171,6 +178,8 @@ static double unpackAxis(int16_t raw) {
}
}
extern "C" {
/**
* Set the accelerometer to active or standby mode. It must be in standby
* mode to change any configuration.
@@ -232,3 +241,5 @@ double getAccelerometerZ() {
int raw = (readRegister(kReg_OutZMSB) << 4) | (readRegister(kReg_OutZLSB) >> 4);
return unpackAxis(raw);
}
} // extern "C"

View File

@@ -1,3 +1,9 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Analog.hpp"
@@ -24,18 +30,20 @@ struct AnalogPort {
tAccumulator *accumulator;
};
bool analogSampleRateSet = false;
priority_recursive_mutex analogRegisterWindowMutex;
tAI* analogInputSystem = NULL;
tAO* analogOutputSystem = NULL;
uint32_t analogNumChannelsToActivate = 0;
static bool analogSampleRateSet = false;
static priority_recursive_mutex analogRegisterWindowMutex;
static tAI* analogInputSystem = NULL;
static tAO* analogOutputSystem = NULL;
static uint32_t analogNumChannelsToActivate = 0;
extern "C" {
// Utility methods defined below.
uint32_t getAnalogNumActiveChannels(int32_t *status);
uint32_t getAnalogNumChannelsToActivate(int32_t *status);
void setAnalogNumChannelsToActivate(uint32_t channels);
static uint32_t getAnalogNumActiveChannels(int32_t *status);
static uint32_t getAnalogNumChannelsToActivate(int32_t *status);
static void setAnalogNumChannelsToActivate(uint32_t channels);
bool analogSystemInitialized = false;
static bool analogSystemInitialized = false;
/**
* Initialize the analog System.
@@ -424,7 +432,7 @@ int32_t getAnalogOffset(void* analog_port_pointer, int32_t *status) {
*
* @return Active channels.
*/
uint32_t getAnalogNumActiveChannels(int32_t *status) {
static uint32_t getAnalogNumActiveChannels(int32_t *status) {
uint32_t scanSize = analogInputSystem->readConfig_ScanSize(status);
if (scanSize == 0)
return 8;
@@ -442,7 +450,7 @@ uint32_t getAnalogNumActiveChannels(int32_t *status) {
*
* @return Value to write to the active channels field.
*/
uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
static uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
if(analogNumChannelsToActivate == 0) return getAnalogNumActiveChannels(status);
return analogNumChannelsToActivate;
}
@@ -455,7 +463,7 @@ uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
*
* @param channels Number of active channels.
*/
void setAnalogNumChannelsToActivate(uint32_t channels) {
static void setAnalogNumChannelsToActivate(uint32_t channels) {
analogNumChannelsToActivate = channels;
}
@@ -744,3 +752,5 @@ int32_t getAnalogVoltsToValueIntHack(void* analog_port_pointer, int voltage, int
void setAnalogTriggerLimitsVoltageIntHack(void* analog_trigger_pointer, int lower, int upper, int32_t *status) {
setAnalogTriggerLimitsVoltage(analog_trigger_pointer, intToFloat(lower), intToFloat(upper), status);
}
} // extern "C"

View File

@@ -1,8 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved. */
/* Copyright (c) FIRST 2008-2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"

View File

@@ -1,15 +1,24 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Compressor.hpp"
#include "ctre/PCM.h"
#include <iostream>
static const int NUM_MODULE_NUMBERS = 63;
extern PCM *modules[NUM_MODULE_NUMBERS];
extern PCM *PCM_modules[NUM_MODULE_NUMBERS];
extern void initializePCM(int module);
extern "C" {
void *initializeCompressor(uint8_t module) {
initializePCM(module);
return modules[module];
return PCM_modules[module];
}
bool checkCompressorModule(uint8_t module) {
@@ -114,3 +123,5 @@ void clearAllPCMStickyFaults(void *pcm_pointer, int32_t *status) {
*status = module->ClearStickyFaults();
}
} // extern "C"

View File

@@ -1,3 +1,9 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Digital.hpp"
@@ -53,42 +59,43 @@ struct DigitalPort {
uint32_t PWMGeneratorID;
};
// XXX: Set these back to static once we figure out the memory clobbering issue
// Create a mutex to protect changes to the digital output values
priority_recursive_mutex digitalDIOMutex;
static priority_recursive_mutex digitalDIOMutex;
// Create a mutex to protect changes to the relay values
priority_recursive_mutex digitalRelayMutex;
static priority_recursive_mutex digitalRelayMutex;
// Create a mutex to protect changes to the DO PWM config
priority_recursive_mutex digitalPwmMutex;
priority_recursive_mutex digitalI2COnBoardMutex;
priority_recursive_mutex digitalI2CMXPMutex;
static priority_recursive_mutex digitalPwmMutex;
static priority_recursive_mutex digitalI2COnBoardMutex;
static priority_recursive_mutex digitalI2CMXPMutex;
tDIO* digitalSystem = NULL;
tRelay* relaySystem = NULL;
tPWM* pwmSystem = NULL;
hal::Resource *DIOChannels = NULL;
hal::Resource *DO_PWMGenerators = NULL;
hal::Resource *PWMChannels = NULL;
static tDIO* digitalSystem = NULL;
static tRelay* relaySystem = NULL;
static tPWM* pwmSystem = NULL;
static hal::Resource *DIOChannels = NULL;
static hal::Resource *DO_PWMGenerators = NULL;
static hal::Resource *PWMChannels = NULL;
bool digitalSystemsInitialized = false;
static bool digitalSystemsInitialized = false;
uint8_t i2COnboardObjCount = 0;
uint8_t i2CMXPObjCount = 0;
uint8_t i2COnBoardHandle = 0;
uint8_t i2CMXPHandle = 0;
static uint8_t i2COnboardObjCount = 0;
static uint8_t i2CMXPObjCount = 0;
static uint8_t i2COnBoardHandle = 0;
static uint8_t i2CMXPHandle = 0;
int32_t m_spiCS0Handle = 0;
int32_t m_spiCS1Handle = 0;
int32_t m_spiCS2Handle = 0;
int32_t m_spiCS3Handle = 0;
int32_t m_spiMXPHandle = 0;
priority_recursive_mutex spiOnboardSemaphore;
priority_recursive_mutex spiMXPSemaphore;
tSPI *spiSystem;
static int32_t m_spiCS0Handle = 0;
static int32_t m_spiCS1Handle = 0;
static int32_t m_spiCS2Handle = 0;
static int32_t m_spiCS3Handle = 0;
static int32_t m_spiMXPHandle = 0;
static priority_recursive_mutex spiOnboardSemaphore;
static priority_recursive_mutex spiMXPSemaphore;
static tSPI *spiSystem;
extern "C" {
struct SPIAccumulator {
void* notifier = nullptr;
uint32_t triggerTime;
uint64_t triggerTime;
uint32_t period;
int64_t value = 0;
@@ -805,7 +812,7 @@ void setCounterAverageSize(void* counter_pointer, int32_t size, int32_t *status)
* If it's an analog trigger, determine the module from the high order routing channel
* else do normal digital input remapping based on pin number (MXP)
*/
void remapDigitalSource(bool analogTrigger, uint32_t &pin, uint8_t &module) {
extern "C++" void remapDigitalSource(bool analogTrigger, uint32_t &pin, uint8_t &module) {
if (analogTrigger) {
module = pin >> 4;
} else {
@@ -1492,14 +1499,14 @@ void spiSetHandle(uint8_t port, int32_t handle){
* @param port The number of the port to use. 0-3 for Onboard CS0-CS2, 4 for MXP
* @return The semaphore for the SPI port.
*/
priority_recursive_mutex& spiGetSemaphore(uint8_t port) {
extern "C++" priority_recursive_mutex& spiGetSemaphore(uint8_t port) {
if(port < 4)
return spiOnboardSemaphore;
else
return spiMXPSemaphore;
}
static void spiAccumulatorProcess(uint32_t currentTime, void *param) {
static void spiAccumulatorProcess(uint64_t currentTime, void *param) {
SPIAccumulator* accum = (SPIAccumulator*)param;
// perform SPI transaction
@@ -1872,3 +1879,5 @@ void i2CClose(uint8_t port) {
}
return;
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/HAL.hpp"
#include "HAL/Port.h"
@@ -12,6 +19,7 @@
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <mutex>
#include <unistd.h>
#include <sys/prctl.h>
#include <signal.h> // linux for kill
@@ -23,6 +31,13 @@ const uint32_t kSystemClockTicksPerMicrosecond = 40;
static tGlobal *global = nullptr;
static tSysWatchdog *watchdog = nullptr;
static priority_mutex timeMutex;
static uint32_t timeEpoch = 0;
static uint32_t prevFPGATime = 0;
static void* rolloverNotifier = nullptr;
extern "C" {
void* getPort(uint8_t pin)
{
Port* port = new Port();
@@ -99,6 +114,8 @@ const char* getHALErrorMessage(int32_t code)
return INCOMPATIBLE_STATE_MESSAGE;
case NO_AVAILABLE_RESOURCES:
return NO_AVAILABLE_RESOURCES_MESSAGE;
case RESOURCE_IS_ALLOCATED:
return RESOURCE_IS_ALLOCATED_MESSAGE;
case NULL_PARAMETER:
return NULL_PARAMETER_MESSAGE;
case ANALOG_TRIGGER_LIMIT_ORDER_ERROR:
@@ -182,13 +199,19 @@ uint32_t getFPGARevision(int32_t *status)
*
* @return The current time in microseconds according to the FPGA (since FPGA reset).
*/
uint32_t getFPGATime(int32_t *status)
uint64_t getFPGATime(int32_t *status)
{
if (!global) {
*status = NiFpga_Status_ResourceNotInitialized;
return 0;
}
return global->readLocalTime(status);
std::lock_guard<priority_mutex> lock(timeMutex);
uint32_t fpgaTime = global->readLocalTime(status);
if (*status != 0) return 0;
// check for rollover
if (fpgaTime < prevFPGATime) ++timeEpoch;
prevFPGATime = fpgaTime;
return (((uint64_t)timeEpoch) << 32) | ((uint64_t)fpgaTime);
}
/**
@@ -233,6 +256,12 @@ static void HALCleanupAtExit() {
watchdog = nullptr;
}
static void timerRollover(uint64_t currentTime, void*) {
// reschedule timer for next rollover
int32_t status = 0;
updateNotifierAlarm(rolloverNotifier, currentTime + 0x80000000ULL, &status);
}
/**
* Call this to start up HAL. This is required for robot programs.
*/
@@ -254,6 +283,14 @@ int HALInitialize(int mode)
std::atexit(HALCleanupAtExit);
if (!rolloverNotifier)
rolloverNotifier = initializeNotifier(timerRollover, nullptr, &status);
if (status == 0) {
uint64_t curTime = getFPGATime(&status);
if (status == 0)
updateNotifierAlarm(rolloverNotifier, curTime + 0x80000000ULL, &status);
}
// Kill any previous robot programs
std::fstream fs;
// By making this both in/out, it won't give us an error if it doesnt exist
@@ -300,6 +337,7 @@ int HALInitialize(int mode)
pid = getpid();
fs << pid << std::endl;
fs.close();
return 1;
}
@@ -337,3 +375,5 @@ void imaqGetLastError()
void niTimestamp64()
{
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Interrupts.hpp"
#include "ChipObject.h"
@@ -9,6 +16,8 @@ struct Interrupt // FIXME: why is this internal?
tInterruptManager *manager;
};
extern "C" {
void* initializeInterrupts(uint32_t interruptIndex, bool watcher, int32_t *status)
{
Interrupt* anInterrupt = new Interrupt();
@@ -121,3 +130,5 @@ void setInterruptUpSourceEdge(void* interrupt_pointer, bool risingEdge, bool fal
anInterrupt->anInterrupt->writeConfig_RisingEdge(risingEdge, status);
anInterrupt->anInterrupt->writeConfig_FallingEdge(fallingEdge, status);
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Notifier.hpp"
#include "ChipObject.h"
#include "HAL/HAL.hpp"
@@ -12,12 +19,12 @@ static priority_mutex notifierInterruptMutex;
static priority_recursive_mutex notifierMutex;
static tAlarm *notifierAlarm = nullptr;
static tInterruptManager *notifierManager = nullptr;
static uint32_t closestTrigger = UINT32_MAX;
static uint64_t closestTrigger = UINT64_MAX;
struct Notifier {
Notifier *prev, *next;
void *param;
void (*process)(uint32_t, void*);
uint32_t triggerTime = UINT32_MAX;
void (*process)(uint64_t, void*);
uint64_t triggerTime = UINT64_MAX;
};
static Notifier *notifiers = nullptr;
static std::atomic_flag notifierAtexitRegistered = ATOMIC_FLAG_INIT;
@@ -28,19 +35,19 @@ static void alarmCallback(uint32_t, void*)
std::unique_lock<priority_recursive_mutex> sync(notifierMutex);
int32_t status = 0;
uint32_t currentTime = 0;
uint64_t currentTime = 0;
// the hardware disables itself after each alarm
closestTrigger = UINT32_MAX;
closestTrigger = UINT64_MAX;
// process all notifiers
Notifier *notifier = notifiers;
while (notifier) {
if (notifier->triggerTime != UINT32_MAX) {
if (notifier->triggerTime != UINT64_MAX) {
if (currentTime == 0)
currentTime = getFPGATime(&status);
if (notifier->triggerTime < currentTime) {
notifier->triggerTime = UINT32_MAX;
notifier->triggerTime = UINT64_MAX;
auto process = notifier->process;
auto param = notifier->param;
sync.unlock();
@@ -59,9 +66,11 @@ static void cleanupNotifierAtExit() {
notifierManager = nullptr;
}
void* initializeNotifier(void (*ProcessQueue)(uint32_t, void*), void *param, int32_t *status)
extern "C" {
void* initializeNotifier(void (*process)(uint64_t, void*), void *param, int32_t *status)
{
if (!ProcessQueue) {
if (!process) {
*status = NULL_PARAMETER;
return nullptr;
}
@@ -85,7 +94,7 @@ void* initializeNotifier(void (*ProcessQueue)(uint32_t, void*), void *param, int
notifier->next = notifiers;
if (notifier->next) notifier->next->prev = notifier;
notifier->param = param;
notifier->process = ProcessQueue;
notifier->process = process;
notifiers = notifier;
return notifier;
}
@@ -119,25 +128,40 @@ void cleanNotifier(void* notifier_pointer, int32_t *status)
}
}
void updateNotifierAlarm(void* notifier_pointer, uint32_t triggerTime, int32_t *status)
void* getNotifierParam(void* notifier_pointer, int32_t *status)
{
return ((Notifier*)notifier_pointer)->param;
}
void updateNotifierAlarm(void* notifier_pointer, uint64_t triggerTime, int32_t *status)
{
std::lock_guard<priority_recursive_mutex> sync(notifierMutex);
Notifier* notifier = (Notifier*)notifier_pointer;
notifier->triggerTime = triggerTime;
bool wasActive = (closestTrigger != UINT32_MAX);
bool wasActive = (closestTrigger != UINT64_MAX);
if (!notifierInterruptMutex.try_lock() || notifierRefCount == 0 ||
!notifierAlarm)
return;
if (!notifierInterruptMutex.try_lock() || notifierRefCount == 0 ||
!notifierAlarm)
return;
// Update alarm time if closer than current.
// Update alarm time if closer than current.
if (triggerTime < closestTrigger) {
closestTrigger = triggerTime;
notifierAlarm->writeTriggerTime(triggerTime, status);
// Simply truncate the hardware trigger time to 32-bit.
notifierAlarm->writeTriggerTime((uint32_t)triggerTime, status);
}
// Enable the alarm. The hardware disables itself after each alarm.
if (!wasActive) notifierAlarm->writeEnable(true, status);
notifierInterruptMutex.unlock();
}
void stopNotifierAlarm(void* notifier_pointer, int32_t *status)
{
std::lock_guard<priority_recursive_mutex> sync(notifierMutex);
Notifier* notifier = (Notifier*)notifier_pointer;
notifier->triggerTime = UINT64_MAX;
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/PDP.hpp"
#include "ctre/PDP.h"
//static PDP pdp;
@@ -6,6 +13,8 @@ static const int NUM_MODULE_NUMBERS = 63;
static PDP *pdp[NUM_MODULE_NUMBERS] = { NULL };
extern "C" {
void initializePDP(uint8_t module) {
if(!pdp[module]) {
pdp[module] = new PDP(module);
@@ -68,4 +77,4 @@ void clearPDPStickyFaults(uint8_t module, int32_t *status) {
*status = pdp[module]->ClearStickyFaults();
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Power.hpp"
#include "ChipObject.h"
@@ -9,6 +16,8 @@ static void initializePower(int32_t *status) {
}
}
extern "C" {
/**
* Get the roboRIO input voltage
*/
@@ -125,3 +134,5 @@ int getUserCurrentFaults3V3(int32_t *status) {
initializePower(status);
return (int)power->readFaultCounts_OverCurrentFaultCount3V3(status);
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Semaphore.hpp"
#include "Log.hpp"
@@ -9,6 +16,8 @@ TLogLevel semaphoreLogLevel = logDEBUG;
if (level > semaphoreLogLevel) ; \
else Log().Get(level)
extern "C" {
MUTEX_ID initializeMutexNormal() { return new priority_mutex; }
void deleteMutex(MUTEX_ID sem) { delete sem; }
@@ -40,3 +49,5 @@ void takeMultiWait(MULTIWAIT_ID cond, MUTEX_ID m) {
}
void giveMultiWait(MULTIWAIT_ID cond) { cond->notify_all(); }
} // extern "C"

View File

@@ -1,9 +1,18 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/SerialPort.hpp"
#include "visa/visa.h"
uint32_t m_resourceManagerHandle;
uint32_t m_portHandle[2];
static uint32_t m_resourceManagerHandle;
static uint32_t m_portHandle[2];
extern "C" {
void serialInitializePort(uint8_t port, int32_t *status) {
char const * portName;
@@ -144,5 +153,5 @@ void serialClose(uint8_t port, int32_t *status) {
if(*status > 0)
*status = 0;
}
} // extern "C"

View File

@@ -1,3 +1,9 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Solenoid.hpp"
@@ -9,7 +15,7 @@
static const int NUM_MODULE_NUMBERS = 63;
PCM *modules[NUM_MODULE_NUMBERS] = { NULL };
PCM *PCM_modules[NUM_MODULE_NUMBERS] = { NULL };
struct solenoid_port_t {
PCM *module;
@@ -17,17 +23,19 @@ struct solenoid_port_t {
};
void initializePCM(int module) {
if(!modules[module]) {
modules[module] = new PCM(module);
if(!PCM_modules[module]) {
PCM_modules[module] = new PCM(module);
}
}
extern "C" {
void* initializeSolenoidPort(void *port_pointer, int32_t *status) {
Port* port = (Port*) port_pointer;
initializePCM(port->module);
solenoid_port_t *solenoid_port = new solenoid_port_t;
solenoid_port->module = modules[port->module];
solenoid_port->module = PCM_modules[port->module];
solenoid_port->pin = port->pin;
return solenoid_port;
@@ -95,3 +103,5 @@ void clearAllPCMStickyFaults_sol(void *solenoid_port_pointer, int32_t *status){
*status = port->module->ClearStickyFaults();
}
} // extern "C"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Task.hpp"
#ifndef OK
@@ -9,6 +16,8 @@
#include <signal.h>
extern "C" {
STATUS verifyTaskID(TASK task) {
if (task != nullptr && pthread_kill(*task, 0) == 0) {
return OK;
@@ -49,3 +58,5 @@ STATUS getTaskPriority(TASK task, int* priority) {
return ERROR;
}
}
} // extern "C"

View File

@@ -1,9 +1,18 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/Utilities.hpp"
#include <time.h>
const int32_t HAL_NO_WAIT = 0;
const int32_t HAL_WAIT_FOREVER = -1;
extern "C" {
void delayTicks(int32_t ticks)
{
struct timespec test, remaining;
@@ -42,3 +51,5 @@ void delaySeconds(double s)
test = remaining;
}
}
} // extern "C"

View File

@@ -1,7 +1,8 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved. */
/* Copyright (c) FIRST 2008-2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/cpp/Resource.hpp"

View File

@@ -1,7 +1,8 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2015. All Rights Reserved. */
/* Copyright (c) FIRST 2015-2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/cpp/Semaphore.hpp"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "HAL/cpp/priority_mutex.h"
void priority_recursive_mutex::lock() {

View File

@@ -3,6 +3,8 @@
#include "FRC_NetworkCommunication/FRCComm.h"
#include <cstring>
extern "C" {
int HALGetControlWord(HALControlWord *data)
{
return FRC_NetworkCommunication_getControlWord((ControlWord_t*) data);
@@ -35,6 +37,12 @@ int HALGetJoystickButtons(uint8_t joystickNum, HALJoystickButtons *buttons)
int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor *desc)
{
desc->isXbox = 0;
desc->type = -1;
desc->name[0] = '\0';
desc->axisCount = 0;
desc->buttonCount = 0;
desc->povCount = 0;
return FRC_NetworkCommunication_getJoystickDesc(joystickNum, &desc->isXbox, &desc->type, (char *)(&desc->name),
&desc->axisCount, (uint8_t *)&desc->axisTypes, &desc->buttonCount, &desc->povCount);
}
@@ -126,3 +134,5 @@ void HALNetworkCommunicationObserveUserProgramTest(void)
{
FRC_NetworkCommunication_observeUserProgramTest();
}
} // extern "C"

View File

@@ -1,3 +1,3 @@
/* GNU ld script */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( AS_NEEDED ( -lwpilib_nonshared -lHALAthena -lntcore -lFRC_NetworkCommunication -li2c -lni_emb -lNiFpgaLv -lNiFpga -lnirio_emb_can -lNiRioSrv -lni_rtlog -lRoboRIO_FRC_ChipObject -lspi -lvisa -ldl -lpthread -lrt -lGCBase_gcc-4.4-arm_v2_3 -lGenApi_gcc-4.4-arm_v2_3 -lLog_gcc-4.4-arm_v2_3 -lMathParser_gcc-4.4-arm_v2_3 -llog4cpp_gcc-4.4-arm_v2_3 -lniimaqdx -lnivision -lnivissvc ) )
GROUP ( AS_NEEDED ( -lwpilib_nonshared -lHALAthena -lntcore -lFRC_NetworkCommunication -li2c -lni_emb -lNiFpgaLv -lNiFpga -lnirio_emb_can -lNiRioSrv -lni_rtlog -lRoboRIO_FRC_ChipObject -lspi -lvisa -ldl -lpthread -lrt -lGCBase_gcc-4.4-arm_v2_3 -lGenApi_gcc-4.4-arm_v2_3 -lLog_gcc-4.4-arm_v2_3 -lMathParser_gcc-4.4-arm_v2_3 -llog4cpp_gcc-4.4-arm_v2_3 -lniimaqdx -lnivision -lnivissvc -lnipalu) )

View File

@@ -2,6 +2,10 @@ include 'hal',
'wpilibc',
'wpilibcIntegrationTests',
'wpilibj',
'wpilibjIntegrationTests',
'wpilibjIntegrationTests'
if (hasProperty("makeSim")){
include 'simulation',
'simulation:JavaGazebo',
'simulation:SimDS'
}

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import gazebo.msgs.GzPacket.Packet;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import gazebo.msgs.GzBool.Bool;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import gazebo.msgs.GzPacket.Packet;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import java.io.IOException;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
public interface PublisherRecord {

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import gazebo.msgs.GzPublish.Publish;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import java.io.IOException;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
import gazebo.msgs.GzSubscribe.Subscribe;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package org.gazebosim.transport;
public interface SubscriberCallback<T> {

View File

@@ -1,29 +1,32 @@
## Simulation Directory
## Components and Location
Observe the following directory structure
.
|-- frc_gazebo_plugins (contains Gazebo Plugins)
| |-- clock
| |-- dc_motor
| |-- encoder
| |-- gyro
| |-- plugins
| |-- pneumatic_piston
| |-- potentiometer
| |-- rangefinder
| |-- servo
|
|-- frcsim.bat (launches gazebo with model/plugin paths on windows)
|-- frcsim.sh (launches gazebo with model/plugin paths on linux/mac)
|-- install.sh (convenient linux script to install Eclipse, Eclipse Plugins, and Gazebo)
|-- JavaGazebo (java library used by java simulation. Equivelant of the C++ gazebo_transport)
|-- SimDS (linux driverstation)
Simluation is a mix of wpilib and other components.
The wpilib components are in their respective locations in the /wpilibc and /wpilibj directories.
The gazbeo plugins are currently built with CMake.
Eventually they will be built with gradle.
All of this is delivered to students via the eclipse plugins
## Simulation delivery and installation
For 2016 FRCSim is only officially supported on Ubuntu 14.04 or greater.
However it is possible on any platform that runs Gazebo.
FRCSim is currently delivered via a zip file published by this project,
and is available at first.wpi.edu/FRC/roborio/maven/PROMOTION_STATUS/edu/wpi/first/wpilib/simulation/simulation/1.0.0/simulation-1.0.0.zip
where PROMOTION_STATUS is one of:
- development (the latest commit merged into wpilib)
- beta (used periodically before release)
- release (used just before kick-off and possibly a few other times)
- stable (used for old releases we want to keep around)
The zip contains most of the contents of ~/wpilib/simulation, such as C++ libraries, jars, and scripts
The exmple robot model files are seperate, and can be found under "file releases" on collabnet.
All together you need eclipse, gazebo, those two zips, g++ 4.9, java8, and a few other small packages.
See the frcsim-installer script or the screensteps on manual install for all the nitty-gritty details
The frcsim-installer script is meant for quick and painless setup on Ubuntu 14.04, 15.04, or 15.10
A manual install is a more tedious process, so this is an easy option for students.
## Building
see the top level building.md
See the top level README.md.

View File

@@ -51,4 +51,14 @@ task simDsJavadoc(type: Jar, dependsOn: javadoc) {
group = 'WPILib'
classifier = 'javadoc'
from javadoc.destinationDir
}
}
//we need to move the simulation jars to the install directory
task copyJars(type: Copy) {
description = 'copy SimDS-all.jar to make simulation zip'
group = 'WPILib Simulation'
from shadowJar.archivePath
into "$simulationInstallDir/jar"
}
build.dependsOn shadowJar

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.awt.Dimension;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.awt.event.ActionEvent;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import org.gazebosim.transport.Node;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import org.gazebosim.transport.Node;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.awt.datatransfer.DataFlavor;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.util.ArrayList;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import gazebo.msgs.GzFloat64.Float64;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.awt.event.ActionEvent;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import java.awt.event.ActionEvent;

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj.simulation.ds;
import gazebo.msgs.GzJoystick.Joystick;

35
simulation/build.gradle Normal file
View File

@@ -0,0 +1,35 @@
apply plugin: 'java'
apply plugin: 'maven-publish'
publishing {
publications {
simulation(MavenPublication) {
artifact zip
groupId 'edu.wpi.first.wpilib.simulation'
artifactId 'simulation'
version '1.0.0'
}
}
setupWpilibRepo(it)
}
task copy_resources(type: Copy) {
description = 'copy gz_msgs and install_resources to make simulation zip'
group = 'WPILib Simulation'
into ('gz_msgs') {
from 'gz_msgs'
}
into "$simulationInstallDir"
from 'install_resources'
}
task zip(type: Zip, dependsOn: [copy_resources,
':wpilibc:wpilibcSimCopy',
':simulation:SimDS:copyJars',
':wpilibj:copyJars']) {
description = 'zip of all the resources for simulation'
group = 'WPILib Simulation'
baseName = 'simulation-trusty'
from "$simulationInstallDir"
}

View File

@@ -12,8 +12,6 @@ set (PLUGINS
rangefinder
servo)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/plugins)
link_directories(${GAZEBO_LIBRARY_DIRS})
foreach(PLUGIN ${PLUGINS})
@@ -29,7 +27,11 @@ foreach(PLUGIN ${PLUGINS})
endif()
target_link_libraries(${PLUGIN} gz_msgs ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
install(TARGETS ${PLUGIN} DESTINATION $ENV{HOME}/wpilib/simulation/plugins)
set_target_properties(${PLUGIN}
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${SIMULATION_INSTALL_DIR}/plugins)
endforeach()
# create a dummy target the depends on all the plugins
add_custom_target(${PROJECT_NAME} DEPENDS ${PLUGINS})

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "clock.h"
GZ_REGISTER_MODEL_PLUGIN(Clock)

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "dc_motor.h"
GZ_REGISTER_MODEL_PLUGIN(DCMotor)

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "encoder.h"
GZ_REGISTER_MODEL_PLUGIN(Encoder)

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "gyro.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "external_limit_switch.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "switch.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "internal_limit_switch.h"
InternalLimitSwitch::InternalLimitSwitch(physics::ModelPtr model, sdf::ElementPtr sdf) {

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "switch.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "limit_switch.h"
GZ_REGISTER_MODEL_PLUGIN(LimitSwitch)

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
class Switch {

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include <simulation/gz_msgs/msgs.h>

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include <simulation/gz_msgs/msgs.h>

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).

View File

@@ -1,3 +1,10 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include "simulation/gz_msgs/msgs.h"

308
simulation/frcsim-installer.sh Executable file
View File

@@ -0,0 +1,308 @@
#!/bin/bash
function check-environment {
# Ensure root access
if [ "$(id -u)" != "0" ]; then
echo "*** This script must be run as root!" 1>&2
echo "*** Make sure that you followed the instructions properly." 1>&2
install-fail
fi
# Make sure that we're on Ubuntu.
if [ "$(lsb_release -is)" != "Ubuntu" ]; then
if [ "$(lsb_release -is)" = "" ]; then
echo "*** Distributions other than Ubuntu (such as yours, probably) are not supported." 1>&2
else
echo "*** Distributions other than Ubuntu (such as $(lsb_release -is)) are not supported." 1>&2
fi
echo "*** This means that the install will likely fail." 1>&2
echo "*** Continue anyway? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
fi
# Make sure that we have /etc/apt/sources.list.d available.
if [ ! -e /etc/apt/sources.list.d ]; then
echo "*** Cannot find /etc/apt/sources.list.d - is apt installed?"
install-fail
fi
# Make sure that apt-key is installed.
if ! which apt-key >/dev/null; then
echo "*** You don't appear to have apt-key installed." 1>&2
echo "*** Please install apt and run the script again." 1>&2
install-fail
fi
# Make sure that apt-get is installed.
if ! which apt-get >/dev/null; then
echo "*** You don't appear to have apt-get installed." 1>&2
echo "*** Please install apt and run the script again." 1>&2
install-fail
fi
# Make sure that we have internet access.
if ! ping 8.8.8.8 -c 1 >/dev/null; then
echo "*** You don't appear to be able to access the internet! (Can't ping 8.8.8.8)" 1>&2
install-fail
fi
# Make sure that wget is installed.
if ! which wget >/dev/null; then
echo "*** You don't appear to have wget installed." 1>&2
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
apt-get install wget -y
fi
# Make sure that python is installed
if ! which python >/dev/null; then
echo "*** You don't appear to have python installed." 1>&2
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
apt-get install python -y
fi
# Make sure that unzip is installed
if ! which unzip >/dev/null; then
echo "*** You don't appear to have unzip installed." 1>&2
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
apt-get install unzip -y
fi
# Make sure that app-apt-repository is installed
if ! which add-apt-repository >/dev/null; then
echo "*** You don't appear to have all apt commands installed." 1>&2
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
apt-get install software-properties-common -y
fi
}
function remove-frcsim {
echo "*** Remove Gazebo package entry too? (y/n)" 1>&2
read CONT
if [ "$CONT" == "y" -o "$CONT" == "Y" ]; then
rm -f /etc/apt/sources.list.d/gazebo-latest.list
fi
apt-get remove --auto-remove libgazebo6-dev gazebo6 g++-4.9 openjdk-8-jdk
rm -rf /opt/eclipse
rm -f /usr/share/applications/frcsim.desktop /usr/share/applications/eclipse.desktop /usr/share/applications/sim_ds.desktop
rm -f /usr/bin/frcism /usr/bin/sim_ds /usr/bin/eclipse
rm -rf ~/wpilib/simulation
add-apt-repository --remove ppa:openjdk-r/ppa -y
add-apt-repository --remove ppa:ubuntu-toolchain-r/test -y
}
function install-eclipse-plugins {
#valid URLs can have promotion status of any of the following
# - development (used for most recent merge into wpilib)
# - beta
# - release
# - stable
#this file is published to maven repo by simulation/build.gradle
if ! (wget -O /tmp/simulation.zip http://first.wpi.edu/FRC/roborio/maven/$PROMOTION_STATUS/edu/wpi/first/wpilib/simulation/simulation/1.0.0/simulation-1.0.0.zip)
then
echo "***could not download wpilib simulation plugins, wrong URL probably***"
echo "promotion status = $PROMOTION_STATUS"
echo "url = http://first.wpi.edu/FRC/roborio/maven/$PROMOTION_STATUS/edu/wpi/first/wpilib/simulation/simulation/1.0.0/simulation-1.0.0.zip"
install-fail
fi
mkdir -p ~/wpilib/simulation
unzip /tmp/simulation.zip -d ~/wpilib/simulation
rm -f /usr/bin/frcsim /usr/bin/sim_ds
ln -s ~/wpilib/simulation/frcsim /usr/bin/frcsim
ln -s ~/wpilib/simulation/sim_ds /usr/bin/sim_ds
}
function install-eclipse {
if ! (wget -O /tmp/eclipse.tar.gz http://eclipse.mirror.rafal.ca/technology/epp/downloads/release/mars/1/eclipse-cpp-mars-1-linux-gtk-x86_64.tar.gz)
then
echo "***could not download eclipse, wrong URL probably***"
install-fail
fi
tar -xf /tmp/eclipse.tar.gz -C /opt
rm -f /usr/bin/eclipse
ln -s /opt/eclipse/eclipse /usr/bin/eclipse
}
function install-desktops {
# desktop files allow ubuntu (unity) users to "search" for their programs in the sidebar
mv ~/wpilib/simulation/eclipse.desktop /usr/share/applications/eclipse.desktop
mv ~/wpilib/simulation/frcsim.desktop /usr/share/applications/frcsim.desktop
mv ~/wpilib/simulation/sim_ds.desktop /usr/share/applications/sim_ds.desktop
mkdir -p /usr/share/icons/sim_ds
mv ~/wpilib/simulation/sim_ds_logo.png /usr/share/icons/sim_ds/sim_ds_logo.png
}
function install-gz_msgs {
# gz_msgs is built on the end-user system
# that way the versions of protobuf will match whatever the default for that platform is
cd ~/wpilib/simulation/gz_msgs
mkdir build
cd build
cmake ..
make
make install
chmod u+x ~/wpilib/simulation/lib/libgz_msgs.so
}
function install-toolchain {
# older version of ubuntu like 14.04 don't have the versions of g++ and java we need
# we can add some very reliable PPAs to get them however
if [[ "`lsb_release -rs`" == "14.04" ]]
then
echo "*** You're using `lsb_release -r`, you will need additional repositories***"
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
add-apt-repository ppa:openjdk-r/ppa -y
add-apt-repository ppa:ubuntu-toolchain-r/test -y
fi
if [[ "`lsb_release -rs`" == "15.04" ]]
then
echo "*** You're using `lsb_release -r`, you will need additional repositories***"
echo "*** Install? (y/n)" 1>&2
read CONT
if [ "$CONT" != "y" -a "$CONT" != "Y" ]; then
install-fail
fi
add-apt-repository ppa:openjdk-r/ppa -y
fi
# Update and install dependencies
if ! apt-get update
then
echo "*** Could not resynchronize package index files." 1>&2
echo "*** Are you running another update or install?" 1>&2
install-fail
fi
apt-get install cmake libprotoc-dev libprotobuf-dev protobuf-compiler g++-4.9 openjdk-8-jdk -y
rm -f /usr/bin/g++
ln -s /usr/bin/g++-4.9 /usr/bin/g++
}
function install-models {
# this zip file is made by hand. A better option to add models is to use the gazebo repository
if ! (wget -O /tmp/models.zip https://usfirst.collab.net/sf/frs/do/downloadFile/projects.wpilib/frs.simulation.frcsim_gazebo_models/frs1160?)
then
echo "*** failed to download models. Check your internet connection! ***"
install-fail
fi
unzip /tmp/models.zip -d /tmp
mv /tmp/frcsim-gazebo-models/models ~/wpilib/simulation/models
mv /tmp/frcsim-gazebo-models/worlds ~/wpilib/simulation/worlds
}
function install-frcsim {
check-environment
# Add Gazebo Repository and Key
if ! echo "deb http://packages.osrfoundation.org/gazebo/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-latest.list
then
echo "*** Cannot add Gazebo repository!" 1>&2
install-fail
fi
if ! (wget http://packages.osrfoundation.org/gazebo.key -O - | apt-key add -)
then
echo "*** Cannot add Gazebo repository key!" 1>&2
if ! ping packages.osrfoundation.org -c 1 >/dev/null; then
echo "*** The package host for Gazebo appears to be down. Try again later." 1>&2
fi
install-fail
fi
install-toolchain
if ! apt-get install -y libgazebo6-dev gazebo6
then
echo "*** Could not install frcsim packages. See above output for details." 1>&2
echo "*** Are you running another update or install?" 1>&2
install-fail
fi
install-eclipse-plugins
install-gz_msgs
install-eclipse
install-desktops
install-models
change-ownership
# Done
echo "Installation Finished!!"
}
function install-fail {
echo "***INSTALLATION UNSUCCESSFUL***"
echo "***Check the output about for anything that looks like errors***"
echo "Please comment on the following to tutorial if you're unable to resolve your problem:"
echo "https://wpilib.screenstepslive.com/s/4485/m/23353/l/478421-installing-frcsim-with-a-script-ubuntu"
exit 1
}
function change-ownership {
chown -R $NON_SUDO_USER:$NON_SUDO_USER ~/wpilib
}
if [ "$1" == "INSTALL-ROOT" ]
then
if [ -z "$2" ]
then
echo "*** Could not set user ~/wpilib ownership to empty user***"
install-fail
else
NON_SUDO_USER="$2"
fi
if [ -z "$3" ]
then
PROMOTION_STATUS="release"
else
PROMOTION_STATUS="$3"
fi
install-frcsim
elif [ "$1" == "INSTALL" ]
then
NON_SUDO_USER="$USER"
PROMOTION_STATUS="$2"
SUDO_ASKPASS=/usr/bin/ssh-askpass sudo bash -c "$0 INSTALL-ROOT $NON_SUDO_USER $PROMOTION_STATUS"
elif [ "$1" == "REMOVE-ROOT" ]
then
remove-frcsim
elif [ "$1" == "REMOVE" ]
then
NON_SUDO_USER="$USER"
SUDO_ASKPASS=/usr/bin/ssh-askpass sudo bash -c "$0 REMOVE-ROOT $NON_SUDO_USER $PROMOTION_STATUS"
else
echo "***This script requires an argument!***"
echo "***Run ./frcsim_installer.sh INSTALL to install***"
echo "***The other option is REMOVE"
fi

View File

@@ -1,5 +0,0 @@
#!/bin/bash
export GAZEBO_PLUGIN_PATH="${GAZEBO_PLUGIN_PATH}:${HOME}/wpilib/simulation/plugins"
export GAZEBO_MODEL_PATH="${GAZEBO_MODEL_PATH}:${HOME}/wpilib/simulation/models"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${HOME}/wpilib/simulation/plugins"
gazebo $@

View File

@@ -1,6 +1,25 @@
cmake_minimum_required(VERSION 2.8)
Cmake_minimum_required(VERSION 2.8)
project(gz_msgs)
#copied from GazeboUtils.cmake
macro (APPEND_TO_CACHED_STRING _string _cacheDesc)
FOREACH (newItem ${ARGN})
SET (${_string} "${${_string}} ${newItem}" CACHE INTERNAL ${_cacheDesc} FORCE)
ENDFOREACH (newItem ${ARGN})
endmacro (APPEND_TO_CACHED_STRING)
find_package(Protobuf REQUIRED)
if (NOT PROTOBUF_FOUND)
MESSAGE ("Missing: Google Protobuf (libprotobuf-dev)")
endif()
if (NOT PROTOBUF_PROTOC_EXECUTABLE)
MESSAGE ( "Missing: Google Protobuf Compiler (protobuf-compiler)")
endif()
if (NOT PROTOBUF_PROTOC_LIBRARY)
MESSAGE ("Missing: Google Protobuf Compiler Library (libprotoc-dev)")
endif()
#list all proto files used
get_filename_component(PROTO_DIR src/main/proto ABSOLUTE)
set(msgs
@@ -62,3 +81,9 @@ else()
endif()
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "$ENV{HOME}/wpilib/simulation/lib")
install(TARGETS ${PROJECT_NAME}
DESTINATION "$ENV{HOME}/wpilib/simulation/lib")
install(DIRECTORY "${GZ_MSGS_INCLUDE_DIR}/simulation"
DESTINATION "$ENV{HOME}/wpilib/simulation/include")

View File

@@ -1,6 +1,19 @@
Building gz_msgs
================
Currently uses cmake.
This is build as a part of the whole cmake project.
see top level building.md for detail
gz_msgs currently uses cmake, is built on the end-users computer.
This allows us to support various versions of protobuf (2.5 on Ubuntu 14.04, 2.6 on Ubuntu 15.10)
To build, run the following commands in the ~/wpilib/simulation/gz_msgs directory.
If that directory doesn't exist, it means you haven't installed correctly.
If you're a developer for wpilib, you will need to unzip the simulation.zip file you published into ~/releases.
If you are a student using FRCSim, you should have downloaded that zip when you installed frcsim.
mkdir build
cd build
cmake ..
make
make install
If you are installing FRCSim with the script, then this *should* have be done for you.

View File

@@ -0,0 +1,7 @@
[Desktop Entry]
Name=Eclipse
Exec=/usr/bin/eclipse
Icon=/opt/eclipse/icon.xpm
Type=Application
Categories=Development;Education;Science;
StartupNotify=true

View File

@@ -0,0 +1,5 @@
#!/bin/bash
export GAZEBO_PLUGIN_PATH="${HOME}/wpilib/simulation/plugins:${GAZEBO_PLUGIN_PATH}"
export GAZEBO_MODEL_PATH="${HOME}/wpilib/simulation/models:${GAZEBO_MODEL_PATH}"
export LD_LIBRARY_PATH="${HOME}/wpilib/simulation/plugins:${HOME}/wpilib/simulation/lib:${LD_LIBRARY_PATH}"
gazebo --verbose $@

View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Name=FRCSim
Keywords=frcsim,gazebo
Exec=/usr/bin/frcsim
Icon=gazebo
Type=Application
StartupNotify=true
Terminal=false
Categories=Development;IDE;Java;Education;Science

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
java -Djava.library.path=${HOME}/wpilib/simulation/lib -jar ~/wpilib/simulation/jar/SimDS-all.jar

View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Name=Sim DS
Keywords=frcsim,driverstation
Exec=/usr/bin/sim_ds
Icon=/usr/share/icons/sim_ds/sim_ds_logo.png
Type=Application
StartupNotify=true
Terminal=false
Categories=Development;IDE;Java;Education;Science

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

2470
styleguide/cppguide.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="1">
<profile kind="CodeFormatterProfile" name="Google C++" version="1">
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.lineSplit" value="80"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_member_access" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list" value="83"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.tabulation.size" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_enumerator_list" value="51"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_declarator_list" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation" value="18"/>
<setting id="org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_expression_list" value="0"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression" value="34"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces" value="1"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_compact_if" value="0"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain" value="18"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain" value="18"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.indentation.size" value="2"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters" value="insert"/>
<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments" value="do not insert"/>
</profile>
</profiles>

View File

@@ -0,0 +1,337 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="GoogleStyle" version="12">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_prefer_two_fragments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_comment_inline_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_local_variable_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="1040"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression.count_dependent" value="16|4|80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration.count_dependent" value="16|4|49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_local_variable_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants.count_dependent" value="16|5|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_type_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_field_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment_new_line_at_start_of_html_paragraph" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comment_prefix" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_parameter_annotation" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter.count_dependent" value="1040|-1|1040"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.force_if_else_statement_brace" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="3"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_package_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="1585"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_new_anonymous_class" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration.count_dependent" value="16|4|48"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method.count_dependent" value="1585|-1|1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_member_annotation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="1585"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments.count_dependent" value="16|-1|16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration.count_dependent" value="16|5|80"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_for_statement" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
</profile>
</profiles>

BIN
styleguide/include/link.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

View File

@@ -0,0 +1,261 @@
/* General CSS */
body {
background-color: #fff;
color: #333;
font-family: sans-serif;
font-size: 10pt;
margin-right: 100px;
margin-left: 100px;
}
h1 {
text-align: center;
font-size: 18pt;
}
h1, h2, h3, h4, h5, h6 {
color: #06c;
margin-top: 2em;
margin-bottom: 1em;
padding: 25px;
font-weight:bold;
}
h2,
h3,
h4,
h5,
h6 {
margin-top:1.5em;
margin-bottom:.75em;
}
h1 {font-size:200%;}
h2 {font-size:167%;}
h3 {font-size:133%;}
h4 {font-size:120%;}
h5 {font-size:110%;}
table {
border: 1px solid #bbb;
border-spacing: 0;
border-collapse: collapse;
margin: 0 0 1.5em;
vertical-align: middle;
width: 100%
}
td, th {
border: 1px solid #ccc;
padding: 2px 12px;
font-size: 10pt;
}
code, samp, var {
background-color:#FAFAFA;
white-space: nowrap
}
pre {
padding:6px 10px;
background-color:#FAFAFA;
border:1px solid #bbb;
overflow:auto;
}
pre.prettyprint {
padding:6px 10px !important;
border:1px solid #bbb !important;
}
code.bad, code.badcode {
color: magenta;
}
pre.bad, pre.badcode {
background-color:#ffe6d8;
border-top:1px inset #a03;
border-left:1px inset #a03;
}
hr {
margin-top: 3.5em;
border-width: 1px;
color: #fff;
}
/* TOC CSS */
table.columns {
border: none;
}
td.two_columns {
-webkit-column-count: 2;
column-count: 2;
}
.toc_category {
font-size: 10pt;
padding-top: 1em;
padding-bottom: 1em;
border-left-width: 2px;
border-right-width: 2px;
border-color: grey;
}
.toc_stylepoint {
font-size: 10pt;
padding-top: 1em;
padding-bottom: 1em;
}
li.toc_entry {
padding-right: 1em;
display: inline;
list-style-type: none;
}
/*
* This space is required to trigger the linewrap on the links
* at href boundaries
*/
li.toc_entry::after {
content: " ";
}
li.toc_entry a {
white-space: nowrap;
}
/* Horizontal TOC */
.toc td, .toc th {
border-width: 1px 5px;
overflow: hidden;
}
/* Vertical TOC */
.toc td.two_columns {
border-width: 0px;
}
/* Special Sections */
address {
text-align: right;
}
.revision {
text-align: right;
}
.headerbox {
margin-left: 50%;
font-size: 75%;
}
.legend {
padding-top: 1em;
margin-left: 50%;
font-size: 10pt;
}
.link_button {
float: left;
display: none;
background-color: #f8f8ff;
border-color: #f0f0ff;
border-style: solid;
border-width: 1px;
font-size: 75%;
margin-top: 0;
margin-left: -50px;
padding: 24px;
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
}
.ignoreLink {
padding: 0px;
}
.divider{
width:5px;
height:auto;
display:inline-block;
}
/* Style Guide semantic CSS */
.summary {
margin-top: 1em;
margin-bottom: 1em;
}
.stylebody {
margin-top: 1em;
margin-bottom: 1em;
}
.stylepoint_section {
display: block;
margin-bottom: 1em;
font-family: sans-serif;
font-weight: bold;
}
.stylepoint_subsection {
display: block;
margin-bottom: 1em;
}
.stylepoint_subsubsection {
display: block;
margin-bottom: 1em;
}
.definition:before {
content: "Definition: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}
.pros:before {
content: "Pros: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}
.cons:before {
content: "Cons: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}
.decision:before {
content: "Decision: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}
.exception:before {
content: "Exception: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}
.note:before {
content: "Note: ";
font-weight: bold;
display: block;
margin-bottom: 1em;
}

View File

@@ -0,0 +1,289 @@
TocTypeEnum = {
VERTICAL: 1,
HORIZONTAL: 2
};
function CreateTOC(tocElement) {
// Find the toc element DIV. We'll place our TOC there.
var toc = document.getElementById(tocElement);
var tocTypeClass = toc.className;
var tocType;
switch (tocTypeClass) {
case 'horizontal_toc':
tocType = TocTypeEnum.HORIZONTAL;
break;
case 'vertical_toc':
tocType = TocTypeEnum.VERTICAL;
break;
default:
tocType = TocTypeEnum.VERTICAL;
break;
}
// If toc_levels is defined, set headingLevels to it.
// Otherwise, use default value of "h2,h3"
var headingLevels;
if (typeof toc_levels === 'undefined') {
headingLevels = 'h2,h3';
} else {
}
// Collect all section heading elements in an array
var headings = document.querySelectorAll(headingLevels);
// Add TOC title elements
var tocHeadingDiv = document.createElement('div');
toc.appendChild(tocHeadingDiv);
tocHeadingDiv.className = 'toc_title';
var tocHeading = document.createElement('h3');
toc.appendChild(tocHeading);
tocHeading.className = 'ignoreLink';
tocHeading.id = 'toc';
var tocText = document.createTextNode('Table of Contents');
tocHeading.appendChild(tocText);
// Add table and tbody
var tocTable = document.createElement('table');
if (tocType == TocTypeEnum.VERTICAL) {
tocTable.className = 'columns';
}
toc.appendChild(tocTable);
var tbody_element = document.createElement('tbody');
tbody_element.setAttribute('valign', 'top');
tbody_element.className = 'toc';
tocTable.appendChild(tbody_element);
// Get the highest level heading
var firstHeading = headings[0];
var masterLevel = parseInt(headingLevels.charAt(1));
// Get the lowest heading level
var lowestLevel = parseInt(headingLevels.charAt(headingLevels - 1));
switch (tocType) {
case TocTypeEnum.HORIZONTAL:
CreateHorizontalTOC(headings, masterLevel, lowestLevel, tbody_element);
break;
case TocTypeEnum.VERTICAL:
CreateVerticalTOC(headings, masterLevel, lowestLevel, tbody_element);
break;
default:
}
}
function CreateHorizontalTOC(
headings, masterLevel, lowestLevel, tbody_element) {
// Initialize the header counter
var h = 0;
var ignoreChildren = false;
while (h < headings.length) {
// Get current heading
var heading = headings[h];
// Get the current heading level
var level = parseInt(heading.tagName.charAt(1));
if (isNaN(level) || level < 1 || level > lowestLevel) continue;
// If level is a masterLevel, make it a TOC parent category
if ((level == masterLevel) && (!hasClass(heading, 'ignoreLink'))) {
toc_current_row = AddTOCMaster(tbody_element, heading);
ignoreChildren = false;
}
if ((level == masterLevel) && (hasClass(heading, 'ignoreLink'))) {
ignoreChildren = true;
}
if ((level != masterLevel) && (!ignoreChildren)) {
AddTOCElements(toc_current_row, heading);
}
// Advance the header counter
h++;
}
}
// Adds a master Table of Content heading
function AddTOCMaster(tocTable, heading) {
// Add the table row scaffolding
var toc_tr = document.createElement('tr');
tocTable.appendChild(toc_tr);
toc_tr.setAttribute('valign', 'top');
var toc_tr_td = document.createElement('td');
toc_tr.appendChild(toc_tr_td);
var toc_category = document.createElement('div');
toc_tr_td.appendChild(toc_category);
toc_category.className = 'toc_category';
// Create the link to this header
var link = document.createElement('a');
link.href = '#' + heading.id; // Create the anchor link
link.textContent = heading.textContent; // Link text is same as heading
toc_category.appendChild(link);
// Add the container table cell for its children
var toc_td = document.createElement('td');
toc_tr.appendChild(toc_td);
var toc_td_div = document.createElement('div');
toc_td_div.className = 'toc_stylepoint';
toc_td.appendChild(toc_td_div);
return (toc_td_div);
}
// Adds Table of Contents element to a master heading as children
function AddTOCElements(toc_div, heading) {
if (heading.offsetParent === null) {
// The element is currently hidden, so don't create a TOC entry
} else {
// Create the list item element
var toc_list_element = document.createElement('li');
toc_list_element.className = 'toc_entry';
toc_div.appendChild(toc_list_element);
// Create the link to this header
var link = document.createElement('a');
link.href = '#' + heading.id; // Create the anchor link
link.textContent = heading.textContent; // Link text is same as heading
toc_list_element.appendChild(link);
}
}
function CreateVerticalTOC(headings, masterLevel, lowestLevel, tbody_element) {
// Create the Column scaffolding
var toc_tr = document.createElement('tr');
tbody_element.appendChild(toc_tr);
var toc_tr_td = document.createElement('td');
toc_tr_td.className = 'two_columns';
toc_tr.appendChild(toc_tr_td);
// Initialize the header counter and the current row
var h = 0;
var toc_current_col = null;
var ignoreChildren = false;
while (h < headings.length) {
// Get current heading
var heading = headings[h];
// Get the current heading level
var level = parseInt(heading.tagName.charAt(1));
if (isNaN(level) || level < 1 || level > lowestLevel) continue;
// If level is a masterLevel, make it a TOC parent category
if ((level == masterLevel) && (!hasClass(heading, 'ignoreLink'))) {
if (heading.offsetParent === null) {
// The element is currently hidden, so don't create a TOC entry
} else {
var td_dl = document.createElement('dl');
toc_tr_td.appendChild(td_dl);
var td_dt = document.createElement('dt');
td_dl.appendChild(td_dt);
toc_current_col = td_dl;
// Create the link to this header
var link = document.createElement('a');
link.href = '#' + heading.id; // Create the anchor link
link.textContent = heading.textContent; // Link text is same as heading
td_dt.appendChild(link);
ignoreChildren = false;
}
}
// If level is a masterLevel but it's specified to ignore links, skip it
// and its children.
if ((level == masterLevel) && (hasClass(heading, 'ignoreLink'))) {
ignoreChildren = true;
}
if ((level != masterLevel) && (!ignoreChildren)) {
if (heading.offsetParent === null) {
// The element is currently hidden, so don't create a TOC entry
} else {
var td_dd = document.createElement('dd');
toc_current_col.appendChild(td_dd);
// Create the link to this header
var link = document.createElement('a');
link.href = '#' + heading.id; // Create the anchor link
link.textContent = heading.textContent; // Link text is same as heading
td_dd.appendChild(link);
}
}
// Advance the header counter
h++;
}
}
/*
* Utility function for finding elements with a given
* class.
*/
function hasClass(element, cls) {
return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
/*
* Linkify all h2 through h4 headers, except for those marked
* "ignoreLink"
*/
// Add the link image to the element.
function LinkifyHeader(header, fileName, sizePixels) {
var link = document.createElement('a');
link.href = '#' + header.id;
link.alt = 'link to ' + header.id;
link.innerHTML =
'<img src="include/' + fileName + '"' +
' width=' + sizePixels +
' height=' + sizePixels +
' style="float:left;position:relative;bottom:5px;">';
header.appendChild(link);
}
// Find all elements of the given tag and linkify if
// they don't have 'ignoreLink' in their class.
function LinkifyHeadersForTag(tagName) {
var headers = document.getElementsByTagName(tagName);
var header;
for (var j = 0; j != headers.length; j++) {
header = headers[j];
if (!hasClass(header, 'ignoreLink') && ('id' in header)) {
if (header.id != '') {
LinkifyHeader(header, 'link.png', 21);
header.style.left = '-46px';
header.style.position = 'relative';
}
}
}
}
// Linkify all h2, h3, and h4s. h1s are titles.
function LinkifyHeaders() {
LinkifyHeadersForTag('h2');
LinkifyHeadersForTag('h3');
LinkifyHeadersForTag('h4');
}
/*
* Initialize the style guide by showing all internal
* elements and then linkifying the headers.
*/
function initStyleGuide() {
LinkifyHeaders();
CreateTOC('tocDiv');
}

515
styleguide/javaguide.css Normal file
View File

@@ -0,0 +1,515 @@
table {
border-collapse: collapse;
}
td, th {
border: 1px solid #ccc;
padding: 2px 12px;
font-size: 10pt;
}
code, samp, var {
color: #060;
}
pre {
font-size: 10pt;
display: block;
color: #060;
background-color: #e8fff6;
border-color: #f0fff0;
border-style: solid;
border-top-width: 1px;
border-bottom-width: 1px;
border-right-width: 1px;
border-left-width: 5px;
padding-left: 12px;
padding-right: 12px;
padding-top: 4px;
padding-bottom: 4px;
}
pre.badcode {
color: #c00;
background-color: #ffe6d8;
border-color: #fff0f0;
}
hr {
margin-top: 3.5em;
border-width: 1px;
color: #fff;
}
html {
margin-top:2em;
margin-left:10%;
margin-right:10%;
padding:0;
}
.bp-reset-element,
body,
h1,
h2,
h3,
h4,
h5,
h6,
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section,
summary,
blockquote,
q,
th,
td,
caption,
table,
div,
span,
object,
iframe,
p,
pre,
a,
abbr,
acronym,
address,
code,
del,
dfn,
em,
img,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
caption,
tbody,
tfoot,
thead,
tr {
margin:0;
padding:0;
border:0;
font-weight:inherit;
font-style:inherit;
font-size:100%;
font-family:inherit;
vertical-align:baseline;
}
body {
font-family:'Arial', sans-serif;
font-size:81.25%;
color:#222;
background-color:#fff;
line-height:1.67;
overflow: auto;
}
.change {
text-align: right;
margin-bottom:1em;
}
em {
font-style: italic
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight:bold;
}
h1 {
margin-bottom:.50em;
text-align: center
}
h2,
h3,
h4,
h5,
h6 {
margin-top:1.5em;
margin-bottom:.75em;
}
h1 {font-size:200%;}
h2 {font-size:167%;}
h3 {font-size:133%;}
h4 {font-size:120%;}
h5 {font-size:110%;}
p {
margin:0 0 1.5em;
}
a[href=''] {
cursor:default;
}
h1 img,
h2 img,
h3 img,
h4 img,
h5 img,
h6 img {
margin:0;
}
a img {
border:none;
}
pre {
margin:1.5em 0;
white-space:pre;
}
pre,
code,
kbd,
tt {
font:1em 'Droid Sans Mono', monospace;
line-height:1.5;
}
dl {
margin:0 0 1.5em 0;
}
dl dt {
font-weight:bold;
}
dd {
margin-left:1.5em;
}
dd.toc3 {
margin-left:3em;
}
hr {
height:0;
border:0;
border-top:1px solid #ccc;
background-color:#ccc;
}
table {
border:1px solid #bbb;
border-spacing:0;
border-collapse:collapse;
margin:0 0 1.5em;
vertical-align:middle;
width:100%;
}
table.unlined,
table.unlined th,
table.unlined tr,
table.unlined td {
border:0;
}
th,
td,
caption {
float:none !important;
text-align:left;
font-weight:normal;
vertical-align:middle;
padding:4px;
}
caption {
padding:0;
}
td {
border:1px solid #bbb;
vertical-align:top;
}
th {
border:0;
border-bottom:1px solid black;
font-weight:bold;
background:rgb(229, 236, 249);
}
table th code {
background-color:inherit;
color:inherit;
}
table tfoot th {
border:1px solid #bbb;
}
tfoot {
font-style:italic;
}
caption {
background:#eee;
}
table[border='0'] {
border:none;
}
table[border='0']>tbody>tr>td,
table[border='0']>tr>td {
border:none;
}
tr.alt td,
td.alt {
background-color:#efefef;
}
table.striped tr:nth-child(even) td,
table tr.even td {
background:#efefef;
}
table.columns {
border:none;
}
table.columns>tbody>tr>td,
table.columns>tr>td {
border:none;
padding:0 3em 0 0;
}
table.columns>tbody>tr>td:last-child,
table.columns>tr>td:last-child {
border:none;
padding:0;
}
ul,
ol {
margin:0 1.5em 1.5em 0;
padding-left:2em;
}
li ul,
li ol {
margin:0;
}
ul {
list-style-type:disc;
}
ol {
list-style-type:decimal;
}
ul {
list-style-type:disc;
}
ul ul {
list-style-type:circle;
}
ul ul ul {
list-style-type:square;
}
ul.disc {
list-style-type:disc;
}
ul.circle {
list-style-type:circle;
}
ul.square {
list-style-type:square;
}
ol {
list-style-type:decimal;
}
ol ol {
list-style-type:lower-alpha;
}
ol ol ol {
list-style-type:lower-roman;
}
ol ul {
list-style-type:circle;
}
ol.decimal {
list-style-type:decimal;
}
ol.upper-alpha {
list-style-type:upper-alpha;
}
ol.lower-alpha {
list-style-type:lower-alpha;
}
ol.upper-roman {
list-style-type:upper-roman;
}
ol.lower-roman {
list-style-type:lower-roman;
}
ol.nolist,
ul.nolist {
padding-left:0;
list-style-image:none;
list-style-type:none;
margin-left:0;
}
.center {
text-align:center;
}
code,
kbd,
pre {
color:#009900;
}
kbd {
font-weight: bold;
}
table.striped code {
background-color:inherit;
}
pre {
padding:6px 10px;
background-color:#FAFAFA;
border:1px solid #bbb;
overflow:auto;
}
pre.prettyprint {
padding:6px 10px !important;
border:1px solid #bbb !important;
}
code.bad, code.badcode {
color: magenta;
}
pre.bad, pre.badcode {
background-color:#ffe6d8;
border-top:1px inset #a03;
border-left:1px inset #a03;
}
.tip {
background-color:#fffbd9;
padding:6px 8px 6px 10px;
border-left:6px solid #ffef70;
}
.note {
background-color:#e5ecf9;
padding:6px 8px 6px 10px;
border-left:6px solid #36c;
}
@media print {
.str {
color:#060;
}
.kwd {
color:#006;
font-weight:bold;
}
.com {
color:#600;
font-style:italic;
}
.typ {
color:#404;
font-weight:bold;
}
.lit {
color:#044;
}
.pun,
.opn,
.clo {
color:#440;
}
.pln {
color:#000;
}
.tag {
color:#006;
font-weight:bold;
}
.atn {
color:#404;
}
.atv {
color:#060;
}
h1 {
font-style:italic;
}
}
ol.linenums {
margin-top:0;
margin-bottom:0;
}
code {
background-color:#FAFAFA;
padding: 0.25em 0.5em;
white-space: nowrap
}

806
styleguide/javaguide.html Normal file
View File

@@ -0,0 +1,806 @@
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="javaguide.css"/>
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"
type="text/javascript"></script>
<link href="http://www.google.com/favicon.ico"
type="image/x-icon" rel="shortcut icon" />
<title>WPILib Java Style</title>
</head>
<body>
<h1>WPILib Java Style (Based on the
<a href=http://google-styleguide.googlecode.com/svn/trunk/javaguide.html>Google Java Style Guide</a>)</h1>
<div class="change">Last changed: June 19, 2015</div>
<table border="0">
<tr>
<td>
<dl>
<br>
<dt class="toc1">
<a href="#s1-introduction">1 Introduction</a>
</dt>
<dd>
<a href="#s1.1-terminology">1.1 Terminology notes</a>
</dd>
<dd>
<a href="#s1.2-guide-notes">1.2 Guide notes</a>
</dd>
<br>
<dt class="toc1">
<a href="#s2-source-file-basics">2 Source file basics</a>
</dt>
<dd>
<a href="#s2.1-file-name">2.1 File name</a>
</dd>
<dd>
<a href="#s2.2-file-encoding">2.2 File encoding: UTF-8</a>
</dd>
<dd>
<a href="#s2.3-special-characters">2.3 Special characters</a>
</dd>
<dd class="toc3">
<a href="#s2.3.1-whitespace-characters">2.3.1 Whitespace characters</a>
</dd>
<dd class="toc3">
<a href="#s2.3.2-special-escape-sequences">2.3.2 Special escape sequences</a>
</dd>
<dd class="toc3">
<a href="#s2.3.3-non-ascii-characters">2.3.3 Non-ASCII characters</a>
</dd>
<br>
<dt class="toc1">
<a href="#s3-source-file-structure">3 Source file structure</a>
</dt>
<dd>
<a href="#s3.1-copyright-statement">3.1 License or copyright information, if present</a>
</dd>
<dd>
<a href="#s3.2-package-statement">3.2 Package statement</a>
</dd>
<dd>
<a href="#s3.3-import-statements">3.3 Import statements</a>
</dd>
<dd class="toc3">
<a href="#s3.3.1-wildcard-imports">3.3.1 No wildcard imports</a>
</dd>
<dd class="toc3">
<a href="#s3.3.2-import-line-wrapping">3.3.2 No line-wrapping</a>
</dd>
<dd class="toc3">
<a href="#s3.3.3-import-ordering-and-spacing">3.3.3 Ordering and spacing</a>
</dd>
<dd>
<a href="#s3.4-class-declaration">3.4 Class declaration</a>
</dd>
<dd class="toc3">
<a href="#s3.4.1-one-top-level-class">3.4.1 Exactly one top-level class declaration</a>
</dd>
<dd class="toc3">
<a href="#s3.4.2-class-member-ordering">3.4.2 Class member ordering</a>
</dd>
</dl>
</td><td>
<dl>
<br>
<dt class="toc1">
<a href="#s4-formatting">4 Formatting</a>
</dt>
<dd>
<a href="#s4.1-braces">4.1 Braces</a>
</dd>
<dd class="toc3">
<a href="#s4.1.1-braces-always-used">4.1.1 Braces are used where optional</a>
</dd>
<dd class="toc3">
<a href="#s4.1.2-blocks-k-r-style">4.1.2 Nonempty blocks: K &amp; R style</a>
</dd>
<dd class="toc3">
<a href="#s4.1.3-braces-empty-blocks">4.1.3 Empty blocks: may be concise</a>
</dd>
<dd>
<a href="#s4.2-block-indentation">4.2 Block indentation: +2 spaces</a>
</dd>
<dd>
<a href="#s4.3-one-statement-per-line">4.3 One statement per line</a>
</dd>
<dd>
<a href="#s4.4-column-limit">4.4 Column limit: 80 or 100</a>
</dd>
<dd>
<a href="#s4.5-line-wrapping">4.5 Line-wrapping</a>
</dd>
<dd class="toc3">
<a href="#s4.5.1-line-wrapping-where-to-break">4.5.1 Where to break</a>
</dd>
<dd class="toc3">
<a href="#s4.5.2-line-wrapping-indent">4.5.2 Indent continuation lines at least +4 spaces</a>
</dd>
<dd>
<a href="#s4.6-whitespace">4.6 Whitespace</a>
</dd>
<dd class="toc3">
<a href="#s4.6.1-vertical-whitespace">4.6.1 Vertical Whitespace</a>
</dd>
<dd class="toc3">
<a href="#s4.6.2-horizontal-whitespace">4.6.2 Horizontal whitespace</a>
</dd>
<dd class="toc3">
<a href="#s4.6.3-horizontal-alignment">4.6.3 Horizontal alignment: never required</a>
</dd>
<dd>
<a href="#s4.7-grouping-parentheses">4.7 Grouping parentheses: recommended</a>
</dd>
<dd>
<a href="#s4.8-specific-constructs">4.8 Specific constructs</a>
</dd>
<dd class="toc3">
<a href="#s4.8.1-enum-classes">4.8.1 Enum classes</a>
</dd>
<dd class="toc3">
<a href="#s4.8.2-variable-declarations">4.8.2 Variable declarations</a>
</dd>
<dd class="toc3">
<a href="#s4.8.3-arrays">4.8.3 Arrays</a>
</dd>
<dd class="toc3">
<a href="#s4.8.4-switch">4.8.4 Switch statements</a>
</dd>
<dd class="toc3">
<a href="#s4.8.5-annotations">4.8.5 Annotations</a>
</dd>
<dd class="toc3">
<a href="#s4.8.6-comments">4.8.6 Comments</a>
</dd>
<dd class="toc3">
<a href="#s4.8.7-modifiers">4.8.7 Modifiers</a>
</dd>
<dd class="toc3">
<a href="#s4.8.8-numeric-literals">4.8.8 Numeric Literals</a>
</dd>
</dl>
</td><td>
<dl>
<br>
<dt class="toc1">
<a href="#s5-naming">5 Naming</a>
</dt>
<dd>
<a href="#s5.1-identifier-names">5.1 Rules common to all identifiers</a>
</dd>
<dd>
<a href="#s5.2-specific-identifier-names">5.2 Rules by identifier type</a>
</dd>
<dd class="toc3">
<a href="#s5.2.1-package-names">5.2.1 Package names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.2-class-names">5.2.2 Class names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.3-method-names">5.2.3 Method names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.4-constant-names">5.2.4 Constant names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.5-non-constant-field-names">5.2.5 Non-constant field names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.6-parameter-names">5.2.6 Parameter names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.7-local-variable-names">5.2.7 Local variable names</a>
</dd>
<dd class="toc3">
<a href="#s5.2.8-type-variable-names">5.2.8 Type variable names</a>
</dd>
<dd>
<a href="#s5.3-camel-case">5.3 Camel case: defined</a>
</dd>
<br>
<dt class="toc1">
<a href="#s6-programming-practices">6 Programming Practices</a>
</dt>
<dd>
<a href="#s6.1-override-annotation">6.1 @Override: always used</a>
</dd>
<dd>
<a href="#s6.2-caught-exceptions">6.2 Caught exceptions: not ignored</a>
</dd>
<dd>
<a href="#s6.3-static-members">6.3 Static members: qualified using class</a>
</dd>
<dd>
<a href="#s6.4-finalizers">6.4 Finalizers: not used</a>
</dd>
<br>
<dt class="toc1">
<a href="#s7-javadoc">7 Javadoc</a>
</dt>
<dd>
<a href="#s7.1-javadoc-formatting">7.1 Formatting</a>
</dd>
<dd class="toc3">
<a href="#s7.1.1-javadoc-multi-line">7.1.1 General form</a>
</dd>
<dd class="toc3">
<a href="#s7.1.2-javadoc-paragraphs">7.1.2 Paragraphs</a>
</dd>
<dd class="toc3">
<a href="#s7.1.3-javadoc-at-clauses">7.1.3 At-clauses</a>
</dd>
<dd>
<a href="#s7.2-summary-fragment">7.2 The summary fragment</a>
</dd>
<dd>
<a href="#s7.3-javadoc-where-required">7.3 Where Javadoc is used</a>
</dd>
<dd class="toc3">
<a href="#s7.3.1-javadoc-exception-self-explanatory">7.3.1 Exception: self-explanatory methods</a>
</dd>
<dd class="toc3">
<a href="#s7.3.2-javadoc-exception-overrides">7.3.2 Exception: overrides</a>
</dd>
</dl>
</td>
</tr>
</table>
<div><a name="s1-introduction"/>
<h2>1 Introduction&nbsp;<a href="#s1-introduction"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<p><strong>This guide is a work in progress.</strong>
We are currently working on getting this guide updated to
a point where it is useful for WPILib developers to use.</p>
<p>This document serves as the style guide for WPILib. It is <em>heavily</em>
based on the Google Java Style Guide and copies pretty much word-for-word
the formatting/style components of the guide while cutting a couple
of the programming practices. As this guide evolves, we will likely
introduce more suggested/mandated programming practices specific
to WPILib.</p>
<p>It is encouraged that anyone working on the Java WPILib also
read the corresponding C++ guide, as we generally try to develop
the C++ and Java components of the library in parallel and many
programming practices true in one language will be true in the other
(although this is not universally true).</p>
</p><a name="s1.1-terminology"/>
<h3>1.1 Terminology notes&nbsp;<a href="#s1.1-terminology"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>In this document, unless otherwise clarified:</p><ol><li>The term <em>class</em> is used inclusively to mean an "ordinary" class, enum class,
interface or annotation type (<code class="prettyprint lang-java">@interface</code>).</li><li>The term <em>comment</em> always refers to <em>implementation</em> comments. We do not
use the phrase "documentation comments", instead using the common term "Javadoc."</li></ol><p>Other "terminology notes" will appear occasionally throughout the document.</p><a name="s1.2-guide-notes"/>
<h3>1.2 Guide notes&nbsp;<a href="#s1.2-guide-notes"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Example code in this document is <strong>non-normative</strong>. That is, while the examples
are in Google Style, they may not illustrate the <em>only</em> stylish way to represent the
code. Optional formatting choices made in examples should not be enforced as rules.</p><a name="s2-source-file-basics"/>
<h2>2 Source file basics&nbsp;<a href="#s2-source-file-basics"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<a name="s2.1-file-name"/>
<h3>2.1 File name&nbsp;<a href="#s2.1-file-name"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>The source file name consists of the case-sensitive name of the top-level class it contains,
plus the <code>.java</code> extension.</p><a name="s2.2-file-encoding"/>
<h3>2.2 File encoding: UTF-8&nbsp;<a href="#s2.2-file-encoding"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Source files are encoded in <strong>UTF-8</strong>.</p><a name="s2.3-special-characters"/>
<h3>2.3 Special characters&nbsp;<a href="#s2.3-special-characters"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s2.3.1-whitespace-characters"/>
<h4>2.3.1 Whitespace characters&nbsp;<a href="#s2.3.1-whitespace-characters"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Aside from the line terminator sequence, the <strong>ASCII horizontal space
character</strong> (<strong>0x20</strong>) is the only whitespace character that appears
anywhere in a source file. This implies that:</p><ol><li>All other whitespace characters in string and character literals are escaped.</li><li>Tab characters are <strong>not</strong> used for indentation.</li></ol><a name="s2.3.2-special-escape-sequences"/>
<h4>2.3.2 Special escape sequences&nbsp;<a href="#s2.3.2-special-escape-sequences"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>For any character that has a special escape sequence
(<code class="prettyprint lang-java">\b</code>,
<code class="prettyprint lang-java">\t</code>,
<code class="prettyprint lang-java">\n</code>,
<code class="prettyprint lang-java">\f</code>,
<code class="prettyprint lang-java">\r</code>,
<code class="prettyprint lang-java">\"</code>,
<code class="prettyprint lang-java">\'</code> and
<code class="prettyprint lang-java">\\</code>), that sequence
is used rather than the corresponding octal
(e.g. <code class="badcode">\012</code>) or Unicode
(e.g. <code class="badcode">\u000a</code>) escape.</p><a name="s2.3.3-non-ascii-characters"/>
<h4>2.3.3 Non-ASCII characters&nbsp;<a href="#s2.3.3-non-ascii-characters"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>For the remaining non-ASCII characters, either the actual Unicode character
(e.g. <code class="prettyprint lang-java"></code>) or the equivalent Unicode escape
(e.g. <code class="prettyprint lang-java">\u221e</code>) is used, depending only on which
makes the code <strong>easier to read and understand</strong>.</p><p class="tip"><strong>Tip:</strong> In the Unicode escape case, and occasionally even when actual
Unicode characters are used, an explanatory comment can be very helpful.</p><p>Examples:</p><table><tr><th>Example</th><th>Discussion</th></tr><tr><td><code class="prettyprint lang-java">String unitAbbrev = "μs";</code></td><td>Best: perfectly clear even without a comment.</td></tr><tr><td><code class="prettyprint lang-java">String unitAbbrev = "\u03bcs"; // "μs"</code></td><td>Allowed, but there's no reason to do this.</td></tr><tr><td><code class="prettyprint lang-java">String unitAbbrev = "\u03bcs";
// Greek letter mu, "s"</code></td><td>Allowed, but awkward and prone to mistakes.</td></tr><tr><td><code class="badcode">String unitAbbrev = "\u03bcs";</code></td><td>Poor: the reader has no idea what this is.</td></tr><tr><td><code class="prettyprint lang-java">return '\ufeff' + content;
// byte order mark</code></td><td>Good: use escapes for non-printable characters, and comment if necessary.</td></tr></table><p class="tip"><strong>Tip:</strong> Never make your code less readable simply out of fear that
some programs might not handle non-ASCII characters properly. If that should happen, those
programs are <strong>broken</strong> and they must be <strong>fixed</strong>.</p><a name="filestructure"/><a name="s3-source-file-structure"/>
<h2>3 Source file structure&nbsp;<a href="#s3-source-file-structure"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<div><p>A source file consists of, <strong>in order</strong>:</p><ol><li>License or copyright information, if present</li><li>Package statement</li><li>Import statements</li><li>Exactly one top-level class</li></ol></div><p><strong>Exactly one blank line</strong> separates each section that is present.</p><a name="s3.1-copyright-statement"/>
<h3>3.1 License or copyright information, if present&nbsp;<a href="#s3.1-copyright-statement"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>If license or copyright information belongs in a file, it belongs here.</p><a name="s3.2-package-statement"/>
<h3>3.2 Package statement&nbsp;<a href="#s3.2-package-statement"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>The package statement is <strong>not line-wrapped</strong>. The column limit (Section 4.4,
<a href="#s4.4-column-limit">Column limit: 80</a>) does not apply to package statements.</p><a name="imports"/><a name="s3.3-import-statements"/>
<h3>3.3 Import statements&nbsp;<a href="#s3.3-import-statements"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s3.3.1-wildcard-imports"/>
<h4>3.3.1 No wildcard imports&nbsp;<a href="#s3.3.1-wildcard-imports"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p><strong>Wildcard imports</strong>, static or otherwise, <strong>are not used</strong>.</p><a name="s3.3.2-import-line-wrapping"/>
<h4>3.3.2 No line-wrapping&nbsp;<a href="#s3.3.2-import-line-wrapping"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Import statements are <strong>not line-wrapped</strong>. The column limit (Section 4.4,
<a href="#s4.4-column-limit">Column limit: 80</a>) does not apply to import
statements.</p><a name="s3.3.3-import-ordering-and-spacing"/>
<h4>3.3.3 Ordering and spacing&nbsp;<a href="#s3.3.3-import-ordering-and-spacing"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Import statements are divided into the following groups, in this order, with each group
separated by a single blank line:</p><ol><li>All static imports in a single group</li><li><code>com.google</code> imports
(only if this source file is in the <code>com.google</code> package
space)</li><li>Third-party imports, one group per top-level package, in ASCII sort order
<ul><li>for example: <code>android</code>, <code>com</code>, <code>junit</code>, <code>org</code>,
<code>sun</code></li></ul></li><li><code>java</code> imports</li><li><code>javax</code> imports</li></ol><p>Within a group there are no blank lines, and the imported names appear in ASCII sort
order. (<strong>Note:</strong> this is not the same as the import <em>statements</em> being in
ASCII sort order; the presence of semicolons warps the result.)</p><a name="s3.4-class-declaration"/>
<h3>3.4 Class declaration&nbsp;<a href="#s3.4-class-declaration"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="oneclassperfile"/><a name="s3.4.1-one-top-level-class"/>
<h4>3.4.1 Exactly one top-level class declaration&nbsp;<a href="#s3.4.1-one-top-level-class"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Each top-level class resides in a source file of its own.</p><a name="s3.4.2-class-member-ordering"/>
<h4>3.4.2 Class member ordering&nbsp;<a href="#s3.4.2-class-member-ordering"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>The ordering of the members of a class can have a great effect on learnability, but there is
no single correct recipe for how to do it. Different classes may order their members
differently.</p><p>What is important is that each class order its members in <strong><em>some</em> logical
order</strong>, which its maintainer could explain if asked. For example, new methods are not
just habitually added to the end of the class, as that would yield "chronological by date
added" ordering, which is not a logical ordering.</p><a name="overloads"/><a name="s3.4.2.1-overloads-never-split"/>
<h5>3.4.2.1 Overloads: never split&nbsp;<a href="#s3.4.2.1-overloads-never-split"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>When a class has multiple constructors, or multiple methods with the same name, these appear
sequentially, with no intervening members.</p><a name="s4-formatting"/>
<h2>4 Formatting&nbsp;<a href="#s4-formatting"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<p class="terminology"><strong>Terminology Note:</strong> <em>block-like construct</em> refers to
the body of a class, method or constructor. Note that, by Section 4.8.3.1 on
<a href="#s4.8.3.1-array-initializers">array initializers</a>, any array initializer
<em>may</em> optionally be treated as if it were a block-like construct.</p><a name="braces"/><a name="s4.1-braces"/>
<h3>4.1 Braces&nbsp;<a href="#s4.1-braces"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s4.1.1-braces-always-used"/>
<h4>4.1.1 Braces are used where optional&nbsp;<a href="#s4.1.1-braces-always-used"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Braces are used with
<code class="prettyprint lang-java">if</code>,
<code class="prettyprint lang-java">else</code>,
<code class="prettyprint lang-java">for</code>,
<code class="prettyprint lang-java">do</code> and
<code class="prettyprint lang-java">while</code> statements, even when the
body is empty or contains only a single statement.</p><a name="s4.1.2-blocks-k-r-style"/>
<h4>4.1.2 Nonempty blocks: K &amp; R style&nbsp;<a href="#s4.1.2-blocks-k-r-style"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Braces follow the Kernighan and Ritchie style
("<a href="http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html">Egyptian brackets</a>")
for <em>nonempty</em> blocks and block-like constructs:</p><ul><li>No line break before the opening brace.</li><li>Line break after the opening brace.</li><li>Line break before the closing brace.</li><li>Line break after the closing brace <em>if</em> that brace terminates a statement or the body
of a method, constructor or <em>named</em> class. For example, there is <em>no</em> line break
after the brace if it is followed by <code class="prettyprint lang-java">else</code> or a
comma.</li></ul><p>Example:</p><pre class="prettyprint lang-java">
return new MyClass() {
@Override public void method() {
if (condition()) {
try {
something();
} catch (ProblemException e) {
recover();
}
}
}
};
</pre><p>A few exceptions for enum classes are given in Section 4.8.1,
<a href="#s4.8.1-enum-classes">Enum classes</a>.</p><a name="emptyblocks"/><a name="s4.1.3-braces-empty-blocks"/>
<h4>4.1.3 Empty blocks: may be concise&nbsp;<a href="#s4.1.3-braces-empty-blocks"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>An empty block or block-like construct <em>may</em> be closed immediately after it is
opened, with no characters or line break in between
(<code class="prettyprint lang-java">{}</code>), <strong>unless</strong> it is part of a
<em>multi-block statement</em> (one that directly contains multiple blocks:
<code class="prettyprint lang-java">if/else-if/else</code> or
<code class="prettyprint lang-java">try/catch/finally</code>).</p><p>Example:</p><pre class="prettyprint lang-java">
void doNothing() {}
</pre><a name="s4.2-block-indentation"/>
<h3>4.2 Block indentation: +2 spaces&nbsp;<a href="#s4.2-block-indentation"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Each time a new block or block-like construct is opened, the indent increases by two
spaces. When the block ends, the indent returns to the previous indent level. The indent level
applies to both code and comments throughout the block. (See the example in Section 4.1.2,
<a href="#s4.1.2-blocks-k-r-style">Nonempty blocks: K &amp; R Style</a>.)</p><a name="s4.3-one-statement-per-line"/>
<h3>4.3 One statement per line&nbsp;<a href="#s4.3-one-statement-per-line"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Each statement is followed by a line-break.</p><a name="columnlimit"/><a name="s4.4-column-limit"/>
<h3>4.4 Column limit: 80&nbsp;<a href="#s4.4-column-limit"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>
Projects should have a column limit of 80 characters.
Except as noted below, any line that would exceed this limit must be line-wrapped, as explained in
Section 4.5, <a href="#s4.5-line-wrapping">Line-wrapping</a>.
</p><p><strong>Exceptions:</strong></p><ol><li>Lines where obeying the column limit is not possible (for example, a long URL in Javadoc,
or a long JSNI method reference).</li><li><code class="prettyprint lang-java">package</code> and
<code class="prettyprint lang-java">import</code> statements (see Sections
3.2 <a href="#s3.2-package-statement">Package statement</a> and
3.3 <a href="#s3.3-import-statements">Import statements</a>).</li><li>Command lines in a comment that may be cut-and-pasted into a shell.</li></ol><a name="s4.5-line-wrapping"/>
<h3>4.5 Line-wrapping&nbsp;<a href="#s4.5-line-wrapping"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p class="terminology"><strong>Terminology Note:</strong> When code that might otherwise legally
occupy a single line is divided into multiple lines, typically to avoid overflowing the column
limit, this activity is called
<em>line-wrapping</em>.</p><p>There is no comprehensive, deterministic formula showing <em>exactly</em> how to line-wrap in
every situation. Very often there are several valid ways to line-wrap the same piece of code.</p><p class="tip"><strong>Tip:</strong> Extracting a method or local variable may solve the problem
without the need to line-wrap.</p><a name="s4.5.1-line-wrapping-where-to-break"/>
<h4>4.5.1 Where to break&nbsp;<a href="#s4.5.1-line-wrapping-where-to-break"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>The prime directive of line-wrapping is: prefer to break at a
<strong>higher syntactic level</strong>. Also:</p><ol><li>When a line is broken at a <em>non-assignment</em> operator the break comes <em>before</em>
the symbol. (Note that this is not the same practice used in Google style for other languages,
such as C++ and JavaScript.)
<ul><li>This also applies to the following "operator-like" symbols: the dot separator
(<code class="prettyprint lang-java">.</code>), the ampersand in type bounds
(<code class="prettyprint lang-java">&lt;T extends Foo &amp; Bar&gt;</code>), and the pipe in
catch blocks
(<code class="prettyprint lang-java">catch (FooException | BarException e)</code>).</li></ul></li><li>When a line is broken at an <em>assignment</em> operator the break typically comes
<em>after</em> the symbol, but either way is acceptable.
<ul><li>This also applies to the "assignment-operator-like" colon in an enhanced
<code class="prettyprint lang-java">for</code> ("foreach") statement.</li></ul></li><li>A method or constructor name stays attached to the open parenthesis
(<code class="prettyprint lang-java">(</code>) that follows it.</li><li>A comma (<code class="prettyprint lang-java">,</code>) stays attached to the token that
precedes it.</li></ol><a name="indentation"/><a name="s4.5.2-line-wrapping-indent"/>
<h4>4.5.2 Indent continuation lines at least +4 spaces&nbsp;<a href="#s4.5.2-line-wrapping-indent"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>When line-wrapping, each line after the first (each <em>continuation line</em>) is indented
at least +4 from the original line.</p><p>When there are multiple continuation lines, indentation may be varied beyond +4 as
desired. In general, two continuation lines use the same indentation level if and only if they
begin with syntactically parallel elements.</p><p>Section 4.6.3 on <a href="#s4.6.3-horizontal-alignment">Horizontal alignment</a> addresses
the discouraged practice of using a variable number of spaces to align certain tokens with
previous lines.</p><a name="s4.6-whitespace"/>
<h3>4.6 Whitespace&nbsp;<a href="#s4.6-whitespace"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s4.6.1-vertical-whitespace"/>
<h4>4.6.1 Vertical Whitespace&nbsp;<a href="#s4.6.1-vertical-whitespace"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>A single blank line appears:</p><ol><li><em>Between</em> consecutive members (or initializers) of a class: fields, constructors,
methods, nested classes, static initializers, instance initializers.
<ul><li><span class="exception"><strong>Exception:</strong> A blank line between two consecutive
fields (having no other code between them) is optional. Such blank lines are used as needed to
create <em>logical groupings</em> of fields.</span></li></ul></li><li>Within method bodies, as needed to create <em>logical groupings</em> of statements.</li><li><em>Optionally</em> before the first member or after the last member of the class (neither
encouraged nor discouraged).</li><li>As required by other sections of this document (such as Section 3.3,
<a href="#s3.3-import-statements">Import statements</a>).</li></ol><p><em>Multiple</em> consecutive blank lines are permitted, but never required (or encouraged).</p><a name="s4.6.2-horizontal-whitespace"/>
<h4>4.6.2 Horizontal whitespace&nbsp;<a href="#s4.6.2-horizontal-whitespace"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Beyond where required by the language or other style rules, and apart from literals, comments and
Javadoc, a single ASCII space also appears in the following places <strong>only</strong>.</p><ol><li>Separating any reserved word, such as
<code class="prettyprint lang-java">if</code>,
<code class="prettyprint lang-java">for</code> or
<code class="prettyprint lang-java">catch</code>, from an open parenthesis
(<code class="prettyprint lang-java">(</code>)
that follows it on that line</li><li>Separating any reserved word, such as
<code class="prettyprint lang-java">else</code> or
<code class="prettyprint lang-java">catch</code>, from a closing curly brace
(<code class="prettyprint lang-java">}</code>) that precedes it on that line</li><li>Before any open curly brace
(<code class="prettyprint lang-java">{</code>), with two exceptions:
<ul><li><code class="prettyprint lang-java">@SomeAnnotation({a, b})</code> (no space is used)</li><li><code class="prettyprint lang-java">String[][] x = {{"foo"}};</code> (no space is required
between <code class="prettyprint lang-java">{{</code>, by item 8 below)</li></ul></li><li>On both sides of any binary or ternary operator. This also applies to the following
"operator-like" symbols:
<ul><li>the ampersand in a conjunctive type bound:
<code class="prettyprint lang-java">&lt;T extends Foo &amp; Bar&gt;</code></li><li>the pipe for a catch block that handles multiple exceptions:
<code class="prettyprint lang-java">catch (FooException | BarException e)</code></li><li>the colon (<code class="prettyprint lang-java">:</code>) in an enhanced
<code class="prettyprint lang-java">for</code> ("foreach") statement</li></ul></li><li>After <code class="prettyprint lang-java">,:;</code> or the closing parenthesis
(<code class="prettyprint lang-java">)</code>) of a cast</li><li>On both sides of the double slash (<code class="prettyprint lang-java">//</code>) that
begins an end-of-line comment. Here, multiple spaces are allowed, but not required.</li><li>Between the type and variable of a declaration:
<code class="prettyprint lang-java">List&lt;String&gt; list</code></li><li><em>Optional</em> just inside both braces of an array initializer
<ul><li><code class="prettyprint lang-java">new int[] {5, 6}</code> and
<code class="prettyprint lang-java">new int[] { 5, 6 }</code> are both valid</li></ul></li></ol><p class="note"><strong>Note:</strong> This rule never requires or forbids additional space at the
start or end of a line, only <em>interior</em> space.</p><a name="s4.6.3-horizontal-alignment"/>
<h4>4.6.3 Horizontal alignment: never required&nbsp;<a href="#s4.6.3-horizontal-alignment"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p class="terminology"><strong>Terminology Note:</strong> <em>Horizontal alignment</em> is the
practice of adding a variable number of additional spaces in your code with the goal of making
certain tokens appear directly below certain other tokens on previous lines.</p><p>This practice is permitted, but is <strong>never required</strong> by Google Style. It is not
even required to <em>maintain</em> horizontal alignment in places where it was already used.</p><p>Here is an example without alignment, then using alignment:</p><pre class="prettyprint lang-java">
private int x; // this is fine
private Color color; // this too
private int x; // permitted, but future edits
private Color color; // may leave it unaligned
</pre><p class="tip"><strong>Tip:</strong> Alignment can aid readability, but it creates problems for
future maintenance. Consider a future change that needs to touch just one line. This change may
leave the formerly-pleasing formatting mangled, and that is <strong>allowed</strong>. More often
it prompts the coder (perhaps you) to adjust whitespace on nearby lines as well, possibly
triggering a cascading series of reformattings. That one-line change now has a "blast radius."
This can at worst result in pointless busywork, but at best it still corrupts version history
information, slows down reviewers and exacerbates merge conflicts.</p><a name="parentheses"/><a name="s4.7-grouping-parentheses"/>
<h3>4.7 Grouping parentheses: recommended&nbsp;<a href="#s4.7-grouping-parentheses"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Optional grouping parentheses are omitted only when author and reviewer agree that there is no
reasonable chance the code will be misinterpreted without them, nor would they have made the code
easier to read. It is <em>not</em> reasonable to assume that every reader has the entire Java
operator precedence table memorized.</p><a name="s4.8-specific-constructs"/>
<h3>4.8 Specific constructs&nbsp;<a href="#s4.8-specific-constructs"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s4.8.1-enum-classes"/>
<h4>4.8.1 Enum classes&nbsp;<a href="#s4.8.1-enum-classes"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>After each comma that follows an enum constant, a line-break is optional.</p><p>An enum class with no methods and no documentation on its constants may optionally be formatted
as if it were an array initializer (see Section 4.8.3.1 on
<a href="#s4.8.3.1-array-initializers">array initializers</a>).</p><pre class="prettyprint lang-java">
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
</pre><p>Since enum classes <em>are classes</em>, all other rules for formatting classes apply.</p><a name="localvariables"/><a name="s4.8.2-variable-declarations"/>
<h4>4.8.2 Variable declarations&nbsp;<a href="#s4.8.2-variable-declarations"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<a name="s4.8.2.1-variables-per-declaration"/>
<h5>4.8.2.1 One variable per declaration&nbsp;<a href="#s4.8.2.1-variables-per-declaration"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Every variable declaration (field or local) declares only one variable: declarations such as
<code class="badcode">int a, b;</code> are not used.</p><a name="s4.8.2.2-variables-limited-scope"/>
<h5>4.8.2.2 Declared when needed, initialized as soon as
possible&nbsp;<a href="#s4.8.2.2-variables-limited-scope"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Local variables are <strong>not</strong> habitually declared at the start of their containing
block or block-like construct. Instead, local variables are declared close to the point they are
first used (within reason), to minimize their scope. Local variable declarations typically have
initializers, or are initialized immediately after declaration.</p><a name="s4.8.3-arrays"/>
<h4>4.8.3 Arrays&nbsp;<a href="#s4.8.3-arrays"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<a name="s4.8.3.1-array-initializers"/>
<h5>4.8.3.1 Array initializers: can be "block-like"&nbsp;<a href="#s4.8.3.1-array-initializers"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Any array initializer may <em>optionally</em> be formatted as if it were a "block-like
construct." For example, the following are all valid (<strong>not</strong> an exhaustive
list):</p><pre class="prettyprint lang-java">
new int[] { new int[] {
0, 1, 2, 3 0,
} 1,
2,
new int[] { 3,
0, 1, }
2, 3
} new int[]
{0, 1, 2, 3}
</pre><a name="s4.8.3.2-array-declarations"/>
<h5>4.8.3.2 No C-style array declarations&nbsp;<a href="#s4.8.3.2-array-declarations"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>The square brackets form a part of the <em>type</em>, not the variable:
<code class="prettyprint lang-java">String[] args</code>, not
<code class="badcode">String args[]</code>.</p><a name="s4.8.4-switch"/>
<h4>4.8.4 Switch statements&nbsp;<a href="#s4.8.4-switch"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p class="terminology"><strong>Terminology Note:</strong> Inside the braces of a
<em>switch block</em> are one or more <em>statement groups</em>. Each statement group consists of
one or more <em>switch labels</em> (either <code class="prettyprint lang-java">case FOO:</code> or
<code class="prettyprint lang-java">default:</code>), followed by one or more statements.</p><a name="s4.8.4.1-switch-indentation"/>
<h5>4.8.4.1 Indentation&nbsp;<a href="#s4.8.4.1-switch-indentation"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>As with any other block, the contents of a switch block are indented +2.</p><p>After a switch label, a newline appears, and the indentation level is increased +2, exactly as
if a block were being opened. The following switch label returns to the previous indentation
level, as if a block had been closed.</p><a name="fallthrough"/><a name="s4.8.4.2-switch-fall-through"/>
<h5>4.8.4.2 Fall-through: commented&nbsp;<a href="#s4.8.4.2-switch-fall-through"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Within a switch block, each statement group either terminates abruptly (with a
<code class="prettyprint lang-java">break</code>,
<code class="prettyprint lang-java">continue</code>,
<code class="prettyprint lang-java">return</code> or thrown exception), or is marked with a comment
to indicate that execution will or <em>might</em> continue into the next statement group. Any
comment that communicates the idea of fall-through is sufficient (typically
<code class="prettyprint lang-java">// fall through</code>). This special comment is not required in
the last statement group of the switch block. Example:</p><pre class="prettyprint lang-java">
switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
</pre><a name="s4.8.4.3-switch-default"/>
<h5>4.8.4.3 The default case is present&nbsp;<a href="#s4.8.4.3-switch-default"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Each switch statement includes a <code class="prettyprint lang-java">default</code> statement
group, even if it contains no code.</p><a name="annotations"/><a name="s4.8.5-annotations"/>
<h4>4.8.5 Annotations&nbsp;<a href="#s4.8.5-annotations"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Annotations applying to a class, method or constructor appear immediately after the
documentation block, and each annotation is listed on a line of its own (that is, one annotation
per line). These line breaks do not constitute line-wrapping (Section
4.5, <a href="#s4.5-line-wrapping">Line-wrapping</a>), so the indentation level is not
increased. Example:</p><pre class="prettyprint lang-java">
@Override
@Nullable
public String getNameIfPresent() { ... }
</pre><p class="exception"><strong>Exception:</strong> A <em>single</em> parameterless annotation
<em>may</em> instead appear together with the first line of the signature, for example:</p><pre class="prettyprint lang-java">
@Override public int hashCode() { ... }
</pre><p>Annotations applying to a field also appear immediately after the documentation block, but in
this case, <em>multiple</em> annotations (possibly parameterized) may be listed on the same line;
for example:</p><pre class="prettyprint lang-java">
@Partial @Mock DataLoader loader;
</pre><p>There are no specific rules for formatting parameter and local variable annotations.</p><a name="comments"/><a name="s4.8.6-comments"/>
<h4>4.8.6 Comments&nbsp;<a href="#s4.8.6-comments"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<a name="s4.8.6.1-block-comment-style"/>
<h5>4.8.6.1 Block comment style&nbsp;<a href="#s4.8.6.1-block-comment-style"><img height="21" width="21" src="javaguidelink.png"/></a></h5>
<p>Block comments are indented at the same level as the surrounding code. They may be in
<code class="prettyprint lang-java">/* ... */</code> style or
<code class="prettyprint lang-java">// ...</code> style. For multi-line
<code class="prettyprint lang-java">/* ... */</code> comments, subsequent lines must start with
<code>*</code> aligned with the <code>*</code> on the previous line.</p><pre class="prettyprint lang-java">
/*
* This is // And so /* Or you can
* okay. // is this. * even do this. */
*/
</pre><p>Comments are not enclosed in boxes drawn with asterisks or other characters.</p><p class="tip"><strong>Tip:</strong> When writing multi-line comments, use the
<code class="prettyprint lang-java">/* ... */</code> style if you want automatic code formatters to
re-wrap the lines when necessary (paragraph-style). Most formatters don't re-wrap lines in
<code class="prettyprint lang-java">// ...</code> style comment blocks.</p><a name="modifiers"/><a name="s4.8.7-modifiers"/>
<h4>4.8.7 Modifiers&nbsp;<a href="#s4.8.7-modifiers"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Class and member modifiers, when present, appear in the order
recommended by the Java Language Specification:
</p><pre>
public protected private abstract static final transient volatile synchronized native strictfp
</pre><a name="s4.8.8-numeric-literals"/>
<h4>4.8.8 Numeric Literals&nbsp;<a href="#s4.8.8-numeric-literals"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p><code>long</code>-valued integer literals use an uppercase <code>L</code> suffix, never
lowercase (to avoid confusion with the digit <code>1</code>). For example, <code>3000000000L</code>
rather than <code class="badcode">3000000000l</code>.</p><a name="naming"/><a name="s5-naming"/>
<h2>5 Naming&nbsp;<a href="#s5-naming"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<a name="s5.1-identifier-names"/>
<h3>5.1 Rules common to all identifiers&nbsp;<a href="#s5.1-identifier-names"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Identifiers use only ASCII letters and digits, and in two cases noted below, underscores. Thus
each valid identifier name is matched by the regular expression <code>\w+</code> .</p><p> In Google Style special prefixes or
suffixes, like those seen in the examples <code class="badcode">name_</code>,
<code class="badcode">mName</code>, <code class="badcode">s_name</code> and
<code class="badcode">kName</code>, are <strong>not</strong> used.
For WPILib, we do make one exception to this rule for non-constant field name.</p><a name="s5.2-specific-identifier-names"/>
<h3>5.2 Rules by identifier type&nbsp;<a href="#s5.2-specific-identifier-names"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s5.2.1-package-names"/>
<h4>5.2.1 Package names&nbsp;<a href="#s5.2.1-package-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Package names are all lowercase, with consecutive words simply concatenated together (no
underscores). For example, <code>com.example.deepspace</code>, not
<code class="badcode">com.example.deepSpace</code> or
<code class="badcode">com.example.deep_space</code>.</p><a name="s5.2.2-class-names"/>
<h4>5.2.2 Class names&nbsp;<a href="#s5.2.2-class-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Class names are written in <a href="#s5.3-camel-case">UpperCamelCase</a>.</p><p>Class names are typically nouns or noun phrases. For example,
<code class="prettyprint lang-java">Character</code> or
<code class="prettyprint lang-java">ImmutableList</code>. Interface names may also be nouns or
noun phrases (for example, <code class="prettyprint lang-java">List</code>), but may sometimes be
adjectives or adjective phrases instead (for example,
<code class="prettyprint lang-java">Readable</code>).</p><p>There are no specific rules or even well-established conventions for naming annotation types.</p><p><em>Test</em> classes are named starting with the name of the class they are testing, and ending
with <code class="prettyprint lang-java">Test</code>. For example,
<code class="prettyprint lang-java">HashTest</code> or
<code class="prettyprint lang-java">HashIntegrationTest</code>.</p><a name="s5.2.3-method-names"/>
<h4>5.2.3 Method names&nbsp;<a href="#s5.2.3-method-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Method names are written in <a href="#s5.3-camel-case">lowerCamelCase</a>.</p><p>Method names are typically verbs or verb phrases. For example,
<code class="prettyprint lang-java">sendMessage</code> or
<code class="prettyprint lang-java">stop</code>.</p><p>Underscores may appear in JUnit <em>test</em> method names to separate logical components of the
name. One typical pattern is <code>test<i>&lt;MethodUnderTest&gt;</i>_<i>&lt;state&gt;</i></code>,
for example <code class="prettyprint lang-java">testPop_emptyStack</code>. There is no One Correct
Way to name test methods.</p><a name="constants"/><a name="s5.2.4-constant-names"/>
<h4>5.2.4 Constant names&nbsp;<a href="#s5.2.4-constant-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Constant names use <code class="prettyprint lang-java">CONSTANT_CASE</code>: all uppercase
letters, with words separated by underscores. But what <em>is</em> a constant, exactly?</p><p>Every constant is a static final field, but not all static final fields are constants. Before
choosing constant case, consider whether the field really <em>feels like</em> a constant. For
example, if any of that instance's observable state can change, it is almost certainly not a
constant. Merely <em>intending</em> to never mutate the object is generally not
enough. Examples:</p><pre class="prettyprint lang-java">
// Constants
static final int NUMBER = 5;
static final ImmutableList&lt;String&gt; NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set&lt;String&gt; mutableCollection = new HashSet&lt;String&gt;();
static final ImmutableSet&lt;SomeMutableType&gt; mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
</pre><p>These names are typically nouns or noun phrases.</p><a name="s5.2.5-non-constant-field-names"/>
<h4>5.2.5 Non-constant field names&nbsp;<a href="#s5.2.5-non-constant-field-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Non-constant field names (static or otherwise) are written
in <a href="#s5.3-camel-case">lowerCamelCase</a> with a preceding <code class="prettyprint lang-java">m_</code>.</p>
<p>These names are typically nouns or noun phrases. For example,
<code class="prettyprint lang-java">m_computedValues</code> or
<code class="prettyprint lang-java">m_index</code>.</p><a name="s5.2.6-parameter-names"/>
<h4>5.2.6 Parameter names&nbsp;<a href="#s5.2.6-parameter-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Parameter names are written in <a href="#s5.3-camel-case">lowerCamelCase</a>.</p><p>One-character parameter names should be avoided.</p><a name="s5.2.7-local-variable-names"/>
<h4>5.2.7 Local variable names&nbsp;<a href="#s5.2.7-local-variable-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Local variable names are written in <a href="#s5.3-camel-case">lowerCamelCase</a>, and can be
abbreviated more liberally than other types of names.</p><p>However, one-character names should be avoided, except for temporary and looping variables.</p><p>Even when final and immutable, local variables are not considered to be constants, and should not
be styled as constants.</p><a name="s5.2.8-type-variable-names"/>
<h4>5.2.8 Type variable names&nbsp;<a href="#s5.2.8-type-variable-names"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Each type variable is named in one of two styles:</p><ul><li>A single capital letter, optionally followed by a single numeral (such as
<code class="prettyprint lang-java">E</code>, <code class="prettyprint lang-java">T</code>,
<code class="prettyprint lang-java">X</code>, <code class="prettyprint lang-java">T2</code>)
</li><li>A name in the form used for classes (see Section 5.2.2,
<a href="#s5.2.2-class-names">Class names</a>), followed by the capital letter
<code class="prettyprint lang-java">T</code> (examples:
<code class="prettyprint lang-java">RequestT</code>,
<code class="prettyprint lang-java">FooBarT</code>).</li></ul><a name="acronyms"/><a name="camelcase"/><a name="s5.3-camel-case"/>
<h3>5.3 Camel case: defined&nbsp;<a href="#s5.3-camel-case"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Sometimes there is more than one reasonable way to convert an English phrase into camel case,
such as when acronyms or unusual constructs like "IPv6" or "iOS" are present. To improve
predictability, Google Style specifies the following (nearly) deterministic scheme.</p><p>Beginning with the prose form of the name:</p><ol><li>Convert the phrase to plain ASCII and remove any apostrophes. For example, "Müller's
algorithm" might become "Muellers algorithm".</li><li>Divide this result into words, splitting on spaces and any remaining punctuation (typically
hyphens).
<ul><li><em>Recommended:</em> if any word already has a conventional camel-case appearance in common
usage, split this into its constituent parts (e.g., "AdWords" becomes "ad words"). Note
that a word such as "iOS" is not really in camel case <em>per se</em>; it defies <em>any</em>
convention, so this recommendation does not apply.</li></ul></li><li>Now lowercase <em>everything</em> (including acronyms), then uppercase only the first
character of:
<ul><li>... each word, to yield <em>upper camel case</em>, or</li><li>... each word except the first, to yield <em>lower camel case</em></li></ul></li><li>Finally, join all the words into a single identifier.</li></ol><p>Note that the casing of the original words is almost entirely disregarded. Examples:</p><table><tr><th>Prose form</th><th>Correct</th><th>Incorrect</th></tr><tr><td>"XML HTTP request"</td><td><code class="prettyprint lang-java">XmlHttpRequest</code></td><td><code class="badcode">XMLHTTPRequest</code></td></tr><tr><td>"new customer ID"</td><td><code class="prettyprint lang-java">newCustomerId</code></td><td><code class="badcode">newCustomerID</code></td></tr><tr><td>"inner stopwatch"</td><td><code class="prettyprint lang-java">innerStopwatch</code></td><td><code class="badcode">innerStopWatch</code></td></tr><tr><td>"supports IPv6 on iOS?"</td><td><code class="prettyprint lang-java">supportsIpv6OnIos</code></td><td><code class="badcode">supportsIPv6OnIOS</code></td></tr><tr><td>"YouTube importer"</td><td><code class="prettyprint lang-java">YouTubeImporter</code><br/><code class="prettyprint lang-java">YoutubeImporter</code>*</td><td/></tr></table><p>*Acceptable, but not recommended.</p><p class="note"><strong>Note:</strong> Some words are ambiguously hyphenated in the English
language: for example "nonempty" and "non-empty" are both correct, so the method names
<code class="prettyprint lang-java">checkNonempty</code> and
<code class="prettyprint lang-java">checkNonEmpty</code> are likewise both correct.</p><a name="s6-programming-practices"/>
<h2>6 Programming Practices&nbsp;<a href="#s6-programming-practices"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<a name="s6.1-override-annotation"/>
<h3>6.1 @Override: always used&nbsp;<a href="#s6.1-override-annotation"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>A method is marked with the <code class="prettyprint lang-java">@Override</code> annotation
whenever it is legal. This includes a class method overriding a superclass method, a class method
implementing an interface method, and an interface method respecifying a superinterface
method.</p><p class="exception"><strong>Exception:</strong><code class="prettyprint lang-java">@Override</code> may be omitted when the parent method is
<code class="prettyprint lang-java">@Deprecated</code>.</p><a name="caughtexceptions"/><a name="s6.2-caught-exceptions"/>
<h3>6.2 Caught exceptions: not ignored&nbsp;<a href="#s6.2-caught-exceptions"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>Except as noted below, it is very rarely correct to do nothing in response to a caught
exception. (Typical responses are to log it, or if it is considered "impossible", rethrow it as an
<code class="prettyprint lang-java">AssertionError</code>.)</p><p>When it truly is appropriate to take no action whatsoever in a catch block, the reason this is
justified is explained in a comment.</p><pre class="prettyprint lang-java">
try {
int i = Integer.parseInt(response);
return handleNumericResponse(i);
} catch (NumberFormatException ok) {
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
</pre><p class="exception"><strong>Exception:</strong> In tests, a caught exception may be ignored
without comment <em>if</em> it is named <code class="prettyprint lang-java">expected</code>. The
following is a very common idiom for ensuring that the method under test <em>does</em> throw an
exception of the expected type, so a comment is unnecessary here.</p><pre class="prettyprint lang-java">
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
</pre><a name="s6.3-static-members"/>
<h3>6.3 Static members: qualified using class&nbsp;<a href="#s6.3-static-members"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>When a reference to a static class member must be qualified, it is qualified with that class's
name, not with a reference or expression of that class's type.</p><pre class="prettyprint lang-java">
Foo aFoo = ...;
Foo.aStaticMethod(); // good
<span class="badcode">aFoo.aStaticMethod();</span> // bad
<span class="badcode">somethingThatYieldsAFoo().aStaticMethod();</span> // very bad
</pre><a name="finalizers"/><a name="s6.4-finalizers"/>
<h3>6.4 Finalizers: not used&nbsp;<a href="#s6.4-finalizers"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>It is <strong>extremely rare</strong> to override <code class="prettyprint lang-java">Object.finalize</code>.</p><p class="tip"><strong>Tip:</strong> Don't do it. If you absolutely must, first read and understand
<a href="http://books.google.com/books?isbn=8131726592"><em>Effective Java</em></a>
Item 7, "Avoid Finalizers," very carefully, and <em>then</em> don't do it.</p><a name="javadoc"/><a name="s7-javadoc"/>
<h2>7 Javadoc&nbsp;<a href="#s7-javadoc"><img height="21" width="21" src="javaguidelink.png"/></a></h2>
<a name="s7.1-javadoc-formatting"/>
<h3>7.1 Formatting&nbsp;<a href="#s7.1-javadoc-formatting"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<a name="s7.1.1-javadoc-multi-line"/>
<h4>7.1.1 General form&nbsp;<a href="#s7.1.1-javadoc-multi-line"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>The <em>basic</em> formatting of Javadoc blocks is as seen in this example:</p><pre class="prettyprint lang-java">
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }
</pre><p>... or in this single-line example:</p><pre class="prettyprint lang-java">
/** An especially short bit of Javadoc. */
</pre><p>The basic form is always acceptable. The single-line form may be substituted when there are no
at-clauses present, and the entirety of the Javadoc block (including comment markers) can fit on a
single line.</p><a name="s7.1.2-javadoc-paragraphs"/>
<h4>7.1.2 Paragraphs&nbsp;<a href="#s7.1.2-javadoc-paragraphs"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>One blank line—that is, a line containing only the aligned leading asterisk
(<code>*</code>)—appears between paragraphs, and before the group of "at-clauses" if
present. Each paragraph but the first has <code>&lt;p&gt;</code> immediately before the first word,
with no space after.</p><a name="s7.1.3-javadoc-at-clauses"/>
<h4>7.1.3 At-clauses&nbsp;<a href="#s7.1.3-javadoc-at-clauses"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Any of the standard "at-clauses" that are used appear in the order <code>@param</code>,
<code>@return</code>, <code>@throws</code>, <code>@deprecated</code>, and these four types never
appear with an empty description. When an at-clause doesn't fit on a single line, continuation lines
are indented four (or more) spaces from the position of the <code>@</code>.
</p><a name="s7.2-summary-fragment"/>
<h3>7.2 The summary fragment&nbsp;<a href="#s7.2-summary-fragment"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>The Javadoc for each class and member begins with a brief <strong>summary fragment</strong>. This
fragment is very important: it is the only part of the text that appears in certain contexts such as
class and method indexes.</p><p>This is a fragment—a noun phrase or verb phrase, not a complete sentence. It does
<strong>not</strong> begin with <code class="badcode">A {@code Foo} is a...</code>, or
<code class="badcode">This method returns...</code>, nor does it form a complete imperative sentence
like <code class="badcode">Save the record.</code>. However, the fragment is capitalized and
punctuated as if it were a complete sentence.</p><p class="tip"><strong>Tip:</strong> A common mistake is to write simple Javadoc in the form
<code class="badcode">/** @return the customer ID */</code>. This is incorrect, and should be
changed to <code class="prettyprint lang-java">/** Returns the customer ID. */</code>.</p><a name="s7.3.3-javadoc-optional"/><a name="s7.3-javadoc-where-required"/>
<h3>7.3 Where Javadoc is used&nbsp;<a href="#s7.3-javadoc-where-required"><img height="21" width="21" src="javaguidelink.png"/></a></h3>
<p>At the <em>minimum</em>, Javadoc is present for every
<code class="prettyprint lang-java">public</code> class, and every
<code class="prettyprint lang-java">public</code> or
<code class="prettyprint lang-java">protected</code> member of such a class, with a few exceptions
noted below.</p><p>Other classes and members still have Javadoc <em>as needed</em>. Whenever an implementation
comment would be used to define the overall purpose or behavior of a class, method or field, that
comment is written as Javadoc instead. (It's more uniform, and more tool-friendly.)</p><a name="s7.3.1-javadoc-exception-self-explanatory"/>
<h4>7.3.1 Exception: self-explanatory methods&nbsp;<a href="#s7.3.1-javadoc-exception-self-explanatory"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Javadoc is optional for "simple, obvious" methods like
<code class="prettyprint lang-java">getFoo</code>, in cases where there <em>really and truly</em> is
nothing else worthwhile to say but "Returns the foo".</p><p class="note"><strong>Important:</strong> it is not appropriate to cite this exception to justify
omitting relevant information that a typical reader might need to know. For example, for a method
named <code class="prettyprint lang-java">getCanonicalName</code>, don't omit its documentation
(with the rationale that it would say only
<code class="badcode">/** Returns the canonical name. */</code>) if a typical reader may have no idea
what the term "canonical name" means!</p><a name="s7.3.2-javadoc-exception-overrides"/>
<h4>7.3.2 Exception: overrides&nbsp;<a href="#s7.3.2-javadoc-exception-overrides"><img height="21" width="21" src="javaguidelink.png"/></a></h4>
<p>Javadoc is not always present on a method that overrides a supertype method.
</p></div> <hr/>
<div class="change">Last changed: March 21, 2014</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More