Includes library modifications to allow access to AIN_4 (AIN_0 / 5)

Committer:
bryantaylor
Date:
Tue Sep 20 21:26:12 2016 +0000
Revision:
0:eafc3fd41f75
hackathon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bryantaylor 0:eafc3fd41f75 1 # Committing changes to mbedmicro/mbed
bryantaylor 0:eafc3fd41f75 2
bryantaylor 0:eafc3fd41f75 3 * Our current branching model is very simple. We are using ```master``` branch to merge all pull requests.
bryantaylor 0:eafc3fd41f75 4 * Based on stable ```SHA``` version of ```master``` branch we decide to release and at the same time ```tag``` our build release.
bryantaylor 0:eafc3fd41f75 5 * Our current release versioning follows simple integer version: ```94```, ```95```, ```96``` etc.
bryantaylor 0:eafc3fd41f75 6
bryantaylor 0:eafc3fd41f75 7 # Committer Guide
bryantaylor 0:eafc3fd41f75 8
bryantaylor 0:eafc3fd41f75 9 ## How to decide what release(s) should be patched
bryantaylor 0:eafc3fd41f75 10 This section provides a guide to help a committer decide the specific base branch that a change set should be merged into.
bryantaylor 0:eafc3fd41f75 11
bryantaylor 0:eafc3fd41f75 12 Currently our default branch is ```master``` branch. All pull requests should be created against ```master``` branch.
bryantaylor 0:eafc3fd41f75 13 mbed SDK is released currently on master branch under certain tag name (see [Git tagging basics]( http://git-scm.com/book/en/v2/Git-Basics-Tagging)). You can see mbed SDK tags and switch between them to for example go back to previous mbed SDK release.
bryantaylor 0:eafc3fd41f75 14 ```
bryantaylor 0:eafc3fd41f75 15 $ git tag
bryantaylor 0:eafc3fd41f75 16 ```
bryantaylor 0:eafc3fd41f75 17
bryantaylor 0:eafc3fd41f75 18 Please note: mebd SDK ```master``` branch's ```HEAD``` is our latest code and may not be as stable as you expect. We are putting our best effort to run regression testing (in-house) against pull requests and latest code.
bryantaylor 0:eafc3fd41f75 19 Each commit to ```master``` will trigger [GitHub's Travis Continuous Integration](https://travis-ci.org/mbedmicro/mbed/builds).
bryantaylor 0:eafc3fd41f75 20
bryantaylor 0:eafc3fd41f75 21 ### Pull request
bryantaylor 0:eafc3fd41f75 22 Please send pull requests with changes which are:
bryantaylor 0:eafc3fd41f75 23 * Complete (your code will compile and perform as expected).
bryantaylor 0:eafc3fd41f75 24 * Tested on hardware.
bryantaylor 0:eafc3fd41f75 25 * You can use included mbed SDK test suite to perform testing. See TESTING.md.
bryantaylor 0:eafc3fd41f75 26 * If your change, feature do not have a test case included please add one (or more) to cover new functionality.
bryantaylor 0:eafc3fd41f75 27 * If you can't test your functionality describe why.
bryantaylor 0:eafc3fd41f75 28 * Documented source code:
bryantaylor 0:eafc3fd41f75 29 * New, modified functions have descriptive comments.
bryantaylor 0:eafc3fd41f75 30 * You follow coding rules and styles provided by mbed SDK project.
bryantaylor 0:eafc3fd41f75 31 * Documented pull request description:
bryantaylor 0:eafc3fd41f75 32 * Description of changes is added - explain your change / enhancement.
bryantaylor 0:eafc3fd41f75 33 * References to existing issues, other pull requests or forum discussions are included.
bryantaylor 0:eafc3fd41f75 34 * Test results are added.
bryantaylor 0:eafc3fd41f75 35
bryantaylor 0:eafc3fd41f75 36 After you send us your pull request our Gate Keeper will change the state of pull request to:
bryantaylor 0:eafc3fd41f75 37 • ``` enhancement``` or ```bug``` when pull request creates new improvement or fixed issue.
bryantaylor 0:eafc3fd41f75 38 Than we will set for you labels:
bryantaylor 0:eafc3fd41f75 39 • ```review``` to let you know your pull request is under review and you can expect review related comments from us.
bryantaylor 0:eafc3fd41f75 40 • ```in progress``` when you pull request requires some additional change which will for now block this pull request from merging.
bryantaylor 0:eafc3fd41f75 41 At the end we will remove ```review``` label and merge your change if everything goes well.
bryantaylor 0:eafc3fd41f75 42
bryantaylor 0:eafc3fd41f75 43 ## C++ coding rules & coding guidelines
bryantaylor 0:eafc3fd41f75 44 ### Rules
bryantaylor 0:eafc3fd41f75 45 * The mbed SDK code follows K&R style (Reference: [K&R style](http://en.wikipedia.org/wiki/Indent_style#K.26R_style)) with at least 2 exceptions which can be found in the list below the code snippet:
bryantaylor 0:eafc3fd41f75 46
bryantaylor 0:eafc3fd41f75 47 ```c++
bryantaylor 0:eafc3fd41f75 48 static const PinMap PinMap_ADC[] = {
bryantaylor 0:eafc3fd41f75 49 {PTC2, ADC0_SE4b, 0},
bryantaylor 0:eafc3fd41f75 50 {NC , NC , 0}
bryantaylor 0:eafc3fd41f75 51 };
bryantaylor 0:eafc3fd41f75 52
bryantaylor 0:eafc3fd41f75 53 uint32_t adc_function(analogin_t *obj, uint32_t options)
bryantaylor 0:eafc3fd41f75 54 {
bryantaylor 0:eafc3fd41f75 55 uint32_t instance = obj->adc >> ADC_INSTANCE_SHIFT;
bryantaylor 0:eafc3fd41f75 56 switch (options) {
bryantaylor 0:eafc3fd41f75 57 case 1:
bryantaylor 0:eafc3fd41f75 58 timeout = 6;
bryantaylor 0:eafc3fd41f75 59 break;
bryantaylor 0:eafc3fd41f75 60 default:
bryantaylor 0:eafc3fd41f75 61 timeout = 10;
bryantaylor 0:eafc3fd41f75 62 break;
bryantaylor 0:eafc3fd41f75 63 }
bryantaylor 0:eafc3fd41f75 64
bryantaylor 0:eafc3fd41f75 65 while (!adc_hal_is_conversion_completed(instance, 0)) {
bryantaylor 0:eafc3fd41f75 66 if (timeout == 0) {
bryantaylor 0:eafc3fd41f75 67 break;
bryantaylor 0:eafc3fd41f75 68 } else {
bryantaylor 0:eafc3fd41f75 69 timeout--;
bryantaylor 0:eafc3fd41f75 70 }
bryantaylor 0:eafc3fd41f75 71 }
bryantaylor 0:eafc3fd41f75 72
bryantaylor 0:eafc3fd41f75 73 if (obj->adc == ADC_CHANNEL0) {
bryantaylor 0:eafc3fd41f75 74 adc_measure_channel(instance);
bryantaylor 0:eafc3fd41f75 75 adc_stop_channel(instance);
bryantaylor 0:eafc3fd41f75 76 } else {
bryantaylor 0:eafc3fd41f75 77 error("channel not available");
bryantaylor 0:eafc3fd41f75 78 }
bryantaylor 0:eafc3fd41f75 79
bryantaylor 0:eafc3fd41f75 80 #if DEBUG
bryantaylor 0:eafc3fd41f75 81 for (uint32_t i = 0; i < 10; i++) {
bryantaylor 0:eafc3fd41f75 82 printf("Loop : %d", i);
bryantaylor 0:eafc3fd41f75 83 }
bryantaylor 0:eafc3fd41f75 84 #endif
bryantaylor 0:eafc3fd41f75 85 return adc_hal_get_conversion_value(instance, 0);
bryantaylor 0:eafc3fd41f75 86 }
bryantaylor 0:eafc3fd41f75 87 ```
bryantaylor 0:eafc3fd41f75 88 * Indentation - 4 spaces. Please do not use tabs!
bryantaylor 0:eafc3fd41f75 89 * Braces - K&R, except for functions where the opening brace is on the new line.
bryantaylor 0:eafc3fd41f75 90 * 1 TBS - use braces for statements ```if```, ```else```, ```while```, ```for``` (exception from K&R) Reference: [1TBS](http://en.wikipedia.org/wiki/Indent_style#Variant:_1TBS)).
bryantaylor 0:eafc3fd41f75 91 * One line per statement.
bryantaylor 0:eafc3fd41f75 92 * Preprocessor macro starts at the beginning of a new line, the code inside is indented accordingly the code above it.
bryantaylor 0:eafc3fd41f75 93 * Cases within switch are indented (exception from K&R).
bryantaylor 0:eafc3fd41f75 94 * Space after statements if, while, for, switch, same applies to binary and ternary operators.
bryantaylor 0:eafc3fd41f75 95 * Each line has preferably at most 120 characters.
bryantaylor 0:eafc3fd41f75 96 * For pointers, ```*``` is adjacent to a name (analogin_t *obj).
bryantaylor 0:eafc3fd41f75 97 * Don't leave trailing spaces at the end of lines.
bryantaylor 0:eafc3fd41f75 98 * Empty lines should have no trailing spaces.
bryantaylor 0:eafc3fd41f75 99 * Unix line endings are default option for files.
bryantaylor 0:eafc3fd41f75 100 * Use capital letters for macros.
bryantaylor 0:eafc3fd41f75 101 * A file should have an empty line at the end.
bryantaylor 0:eafc3fd41f75 102 and:
bryantaylor 0:eafc3fd41f75 103 * We are not using C++11 yet so do not write code compliant to this standard.
bryantaylor 0:eafc3fd41f75 104 * We are not using libraries like ```BOOST``` so please so not include any ```BOOST``` headers to your code.
bryantaylor 0:eafc3fd41f75 105 * C++ & templates: please take under consideration templates are not fully supported by cross-compilers. You may have difficulties compiling template code few cross-compilers so make sure your template code compilers for more than one compiler.
bryantaylor 0:eafc3fd41f75 106
bryantaylor 0:eafc3fd41f75 107 ### Naming conventions
bryantaylor 0:eafc3fd41f75 108 Classes:
bryantaylor 0:eafc3fd41f75 109 * Begins with a capital letter, and each word in it begins also with a capital letter (```AnalogIn```, ```BusInOut```).
bryantaylor 0:eafc3fd41f75 110 * Methods contain small letters, distinct words separated by underscore.
bryantaylor 0:eafc3fd41f75 111 * Private members starts with an underscore.
bryantaylor 0:eafc3fd41f75 112
bryantaylor 0:eafc3fd41f75 113 User defined types (typedef):
bryantaylor 0:eafc3fd41f75 114 * Structures - suffix ```_t``` - to denote it is user defined type
bryantaylor 0:eafc3fd41f75 115 * Enumeration - the type name and values name - same naming convention as classes (e.g ```MyNewEnum```)
bryantaylor 0:eafc3fd41f75 116
bryantaylor 0:eafc3fd41f75 117 Functions:
bryantaylor 0:eafc3fd41f75 118 * Contain lower case letters (as methods within classes)
bryantaylor 0:eafc3fd41f75 119 * Distinct words separated by underscore (```wait_ms```, ```read_u16```)
bryantaylor 0:eafc3fd41f75 120 * Please make sure that in your module all functions have unique prefix so when your module is compiled with other modules function names (and e.g. extern global variable names) are not in naming conflict.
bryantaylor 0:eafc3fd41f75 121
bryantaylor 0:eafc3fd41f75 122 Example code look&feel:
bryantaylor 0:eafc3fd41f75 123 ```c++
bryantaylor 0:eafc3fd41f75 124 #define ADC_INSTANCE_SHIFT 8
bryantaylor 0:eafc3fd41f75 125
bryantaylor 0:eafc3fd41f75 126 class AnalogIn {
bryantaylor 0:eafc3fd41f75 127 public:
bryantaylor 0:eafc3fd41f75 128 /** Create an AnalogIn, connected to the specified pin
bryantaylor 0:eafc3fd41f75 129 *
bryantaylor 0:eafc3fd41f75 130 * @param pin AnalogIn pin to connect to
bryantaylor 0:eafc3fd41f75 131 * @param name (optional) A string to identify the object
bryantaylor 0:eafc3fd41f75 132 */
bryantaylor 0:eafc3fd41f75 133 AnalogIn(PinName pin) {
bryantaylor 0:eafc3fd41f75 134 analogin_init(&_adc, pin);
bryantaylor 0:eafc3fd41f75 135 }
bryantaylor 0:eafc3fd41f75 136
bryantaylor 0:eafc3fd41f75 137 /** Read the input voltage, represented as a float in the range [0.0, 1.0]
bryantaylor 0:eafc3fd41f75 138 *
bryantaylor 0:eafc3fd41f75 139 * @returns
bryantaylor 0:eafc3fd41f75 140 * A floating-point value representing the current input voltage, measured as a percentage
bryantaylor 0:eafc3fd41f75 141 */
bryantaylor 0:eafc3fd41f75 142 uint32_t read() {
bryantaylor 0:eafc3fd41f75 143 return analogin_read(&_adc, operation);
bryantaylor 0:eafc3fd41f75 144 }
bryantaylor 0:eafc3fd41f75 145
bryantaylor 0:eafc3fd41f75 146 protected:
bryantaylor 0:eafc3fd41f75 147 analogin_t _adc;
bryantaylor 0:eafc3fd41f75 148 };
bryantaylor 0:eafc3fd41f75 149
bryantaylor 0:eafc3fd41f75 150 typedef enum {
bryantaylor 0:eafc3fd41f75 151 ADC0_SE0 = (0 << ADC_INSTANCE_SHIFT) | 0,
bryantaylor 0:eafc3fd41f75 152 } ADCName;
bryantaylor 0:eafc3fd41f75 153
bryantaylor 0:eafc3fd41f75 154 struct analogin_s {
bryantaylor 0:eafc3fd41f75 155 ADCName adc;
bryantaylor 0:eafc3fd41f75 156 };
bryantaylor 0:eafc3fd41f75 157
bryantaylor 0:eafc3fd41f75 158 typedef struct analogin_s analogin_t;
bryantaylor 0:eafc3fd41f75 159 ```
bryantaylor 0:eafc3fd41f75 160 ### Doxygen documentation
bryantaylor 0:eafc3fd41f75 161 All functions / methods should contain a documentation using doxygen javadoc in a header file. More information regarding writing API Documentation, follow [this](https://mbed.org/handbook/API-Documentation) link.
bryantaylor 0:eafc3fd41f75 162
bryantaylor 0:eafc3fd41f75 163 Example of well documentet code:
bryantaylor 0:eafc3fd41f75 164 ```c++
bryantaylor 0:eafc3fd41f75 165 #ifndef ADC_H
bryantaylor 0:eafc3fd41f75 166 #define ADC_H
bryantaylor 0:eafc3fd41f75 167
bryantaylor 0:eafc3fd41f75 168 #ifdef __cplusplus
bryantaylor 0:eafc3fd41f75 169 extern "C" {
bryantaylor 0:eafc3fd41f75 170 #endif
bryantaylor 0:eafc3fd41f75 171
bryantaylor 0:eafc3fd41f75 172 /** ADC Measurement method
bryantaylor 0:eafc3fd41f75 173 *
bryantaylor 0:eafc3fd41f75 174 * @param obj Pointer to the analogin object.
bryantaylor 0:eafc3fd41f75 175 * @param options Options to be enabled by ADC peripheral.
bryantaylor 0:eafc3fd41f75 176 *
bryantaylor 0:eafc3fd41f75 177 * @returns
bryantaylor 0:eafc3fd41f75 178 * Measurement value on defined ADC channel.
bryantaylor 0:eafc3fd41f75 179 */
bryantaylor 0:eafc3fd41f75 180 uint32_t adc_function(analogin_t *obj, uint32_t options)
bryantaylor 0:eafc3fd41f75 181
bryantaylor 0:eafc3fd41f75 182 #ifdef __cplusplus
bryantaylor 0:eafc3fd41f75 183 }
bryantaylor 0:eafc3fd41f75 184 #endif
bryantaylor 0:eafc3fd41f75 185
bryantaylor 0:eafc3fd41f75 186 #endif
bryantaylor 0:eafc3fd41f75 187 ```
bryantaylor 0:eafc3fd41f75 188 ### C/C++ Source code indenter
bryantaylor 0:eafc3fd41f75 189 In Mbed project you can use AStyle (Reference: [Artistic Style](http://astyle.sourceforge.net/)) source code indenter to help you auto format your source code. It will for sure not correct all your coding styles but for sure will eliminate most of them. You can download AStyle from this location.
bryantaylor 0:eafc3fd41f75 190
bryantaylor 0:eafc3fd41f75 191 Official Mbed SDK styles include below AStyle styles (defined by command line switched):
bryantaylor 0:eafc3fd41f75 192 ```
bryantaylor 0:eafc3fd41f75 193 --style=kr --indent=spaces=4 --indent-switches
bryantaylor 0:eafc3fd41f75 194 ```
bryantaylor 0:eafc3fd41f75 195 To format your file you can execute below command. Just replace ```$(FULL_CURRENT_PATH)``` with path to your source file.
bryantaylor 0:eafc3fd41f75 196 ```
bryantaylor 0:eafc3fd41f75 197 $ astyle.exe --style=kr --indent=spaces=4 --indent-switches $(FULL_CURRENT_PATH)
bryantaylor 0:eafc3fd41f75 198 ```
bryantaylor 0:eafc3fd41f75 199
bryantaylor 0:eafc3fd41f75 200 ## Python coding rules & coding guidelines
bryantaylor 0:eafc3fd41f75 201 Some of our tools in tools are written in ```Python 2.7```. In case of developing tools for python we prefer to keep similar code styles across all Python source code. Please note that not all rules must be enforced. For example we do not limit you to 80 characters per line, just be sure your code can fit to widescreen display.
bryantaylor 0:eafc3fd41f75 202
bryantaylor 0:eafc3fd41f75 203 Please stay compatible with ```Python 2.7``` but nothing stops you to write your code so in the future it will by Python 3 friendly.
bryantaylor 0:eafc3fd41f75 204
bryantaylor 0:eafc3fd41f75 205 Please check our Python source code (especially ```test_api.py``` and ```singletest.py```) to get notion of how your new code should look like). We know our code is not perfect but please try to fit the same coding style to existing code so source looks consistent and is not series of different flavors.
bryantaylor 0:eafc3fd41f75 206
bryantaylor 0:eafc3fd41f75 207 Some general guidelines:
bryantaylor 0:eafc3fd41f75 208 * Use Python idioms, please refer to one of many on-line guidelines how to write Pythonic code: [Code Like a Pythonista: Idiomatic Python](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html).
bryantaylor 0:eafc3fd41f75 209 * Please do not use TABs. Please use 4 spaces instead for indentations.
bryantaylor 0:eafc3fd41f75 210 * Please put space character between operators, after comma etc.
bryantaylor 0:eafc3fd41f75 211 * Please document your code, write comments and ```doc``` sections for each function or class you implement.
bryantaylor 0:eafc3fd41f75 212
bryantaylor 0:eafc3fd41f75 213 ### Static Code Analizers for Python
bryantaylor 0:eafc3fd41f75 214 If you are old-school developer for sure you remember tools like lint. "lint was the name originally given to a particular program that flagged some suspicious and non-portable constructs (likely to be bugs) in C language source code." Now lint-like programs are used to check similar code issues for multiple languages, also for Python. Please do use them if you want to commit new code to tools and other mbed SDK Python tooling.
bryantaylor 0:eafc3fd41f75 215
bryantaylor 0:eafc3fd41f75 216 Below is the list Python lint tools you may want to use:
bryantaylor 0:eafc3fd41f75 217
bryantaylor 0:eafc3fd41f75 218 * [pyflakes](https://pypi.python.org/pypi/pyflakes) - Please scan your code with pyflakes and remove all issues reported by it. If you are unsure if something should be modified or not you can skip lint report related fix and report this issue as possible additional commit in your pull request description.
bryantaylor 0:eafc3fd41f75 219
bryantaylor 0:eafc3fd41f75 220 * [pylint](http://www.pylint.org/) - Please scan your code with pylint and check if there are any issues which can be resolved and are obvious "to fix" bugs. For example you may forgot to add 'self' as first parameter in class method parameter list or you are calling unknown functions / functions from not imported modules.
bryantaylor 0:eafc3fd41f75 221
bryantaylor 0:eafc3fd41f75 222 * [pychecker](http://pychecker.sourceforge.net/) - optional, but more the merrier ;)
bryantaylor 0:eafc3fd41f75 223
bryantaylor 0:eafc3fd41f75 224 Example Python look&feel:
bryantaylor 0:eafc3fd41f75 225 ```python
bryantaylor 0:eafc3fd41f75 226 class HostRegistry:
bryantaylor 0:eafc3fd41f75 227 """ Class stores registry with host tests and objects representing them
bryantaylor 0:eafc3fd41f75 228 """
bryantaylor 0:eafc3fd41f75 229 HOST_TESTS = {} # host_test_name -> host_test_ojbect
bryantaylor 0:eafc3fd41f75 230
bryantaylor 0:eafc3fd41f75 231 def register_host_test(self, ht_name, ht_object):
bryantaylor 0:eafc3fd41f75 232 """ Registers (removes) host test by name from HOST_TESTS registry
bryantaylor 0:eafc3fd41f75 233 if host test is not already registered (check by name).
bryantaylor 0:eafc3fd41f75 234 """
bryantaylor 0:eafc3fd41f75 235 if ht_name not in self.HOST_TESTS:
bryantaylor 0:eafc3fd41f75 236 self.HOST_TESTS[ht_name] = ht_object
bryantaylor 0:eafc3fd41f75 237
bryantaylor 0:eafc3fd41f75 238 def unregister_host_test(self):
bryantaylor 0:eafc3fd41f75 239 """ Unregisters (removes) host test by name from HOST_TESTS registry.
bryantaylor 0:eafc3fd41f75 240 """
bryantaylor 0:eafc3fd41f75 241 if ht_name in HOST_TESTS:
bryantaylor 0:eafc3fd41f75 242 self.HOST_TESTS[ht_name] = None
bryantaylor 0:eafc3fd41f75 243
bryantaylor 0:eafc3fd41f75 244 def get_host_test(self, ht_name):
bryantaylor 0:eafc3fd41f75 245 """ Returns HOST_TEST if host name is valid.
bryantaylor 0:eafc3fd41f75 246 In case no host test is available return None
bryantaylor 0:eafc3fd41f75 247 """
bryantaylor 0:eafc3fd41f75 248 return self.HOST_TESTS[ht_name] if ht_name in self.HOST_TESTS else None
bryantaylor 0:eafc3fd41f75 249
bryantaylor 0:eafc3fd41f75 250 def is_host_test(self, ht_name):
bryantaylor 0:eafc3fd41f75 251 """ Function returns True if host name is valid (is in HOST_TESTS)
bryantaylor 0:eafc3fd41f75 252 """
bryantaylor 0:eafc3fd41f75 253 return ht_name in self.HOST_TESTS
bryantaylor 0:eafc3fd41f75 254 ```
bryantaylor 0:eafc3fd41f75 255
bryantaylor 0:eafc3fd41f75 256 ## Testing
bryantaylor 0:eafc3fd41f75 257 Please refer to TESTING.md document for detais regarding mbed SDK test suite and build scripts included in ```mbed/tools/```.
bryantaylor 0:eafc3fd41f75 258
bryantaylor 0:eafc3fd41f75 259 ## Before pull request checklist
bryantaylor 0:eafc3fd41f75 260 * Your pull request description section contains:
bryantaylor 0:eafc3fd41f75 261 * Rationale – tell us why you submitted this pull request. This is your change to write us summary of your change.
bryantaylor 0:eafc3fd41f75 262 * Description – describe changes you’ve made and tell us which new features / functionalities were implemented.
bryantaylor 0:eafc3fd41f75 263 * Manual / Cookbook / Handbook – you can put here manual, cookbook or handbook related to your change / enhancement. Your documentation can stay with pull request.
bryantaylor 0:eafc3fd41f75 264 * Test results (if applicable).
bryantaylor 0:eafc3fd41f75 265 * Make sure you followed project's coding rules and styles.
bryantaylor 0:eafc3fd41f75 266 * No dependencies are created to external C/C++ libraries which are not included already in our repository.
bryantaylor 0:eafc3fd41f75 267 * Please make sure that in your module all functions have unique prefix (no name space collisions).
bryantaylor 0:eafc3fd41f75 268 * You reused existing functionality, please do not add or rewrite existing code. E.g. use mbed’s ```FunctionPointer``` if possible to store your function pointers. Do not write another wrapper for it. We already got one. If some functionality is missing, just add it! Extend our APIs wisely!
bryantaylor 0:eafc3fd41f75 269 * Were you consistent? Please continue using style / code formatting, variables naming etc. in file they are modifying.
bryantaylor 0:eafc3fd41f75 270 * Your code compiles and links. Also doesn’t generate additional compilation warnings.