summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/design_guide.md41
1 files changed, 34 insertions, 7 deletions
diff --git a/docs/design_guide.md b/docs/design_guide.md
index 970be5291..ea4cad8f2 100644
--- a/docs/design_guide.md
+++ b/docs/design_guide.md
@@ -38,16 +38,27 @@ provide `__enter__` and `__exit__` to create a context manager usable with `with
## Verify your device
-Make sure device you are talking to is the device you expect. If not, raise a
-ValueError. Beware that I2C addresses can be identical on different devices so
-read registers you know to make sure they match your expectation. Validating
-this upfront will help catch mistakes.
+Whenever possible, make sure device you are talking to is the device you expect.
+If not, raise a ValueError. Beware that I2C addresses can be identical on
+different devices so read registers you know to make sure they match your
+expectation. Validating this upfront will help catch mistakes.
## Getters/Setters
When designing a driver for a device, use properties for device state and use
-methods for actions that the device performs. Doing this well helps beginners
-understand when to use what. It is also consistent with
+methods for sequences of abstract actions that the device performs. State is a
+property of the device as a whole that exists regardless of what the code is
+doing. This includes things like temperature, time, sound, light and the state
+of a switch. For a more complete list see the sensor properties bullet below.
+
+Another way to separate state from actions is that state is usually something
+the user can sense themselves by sight or feel for example. Actions are
+something the user can watch. The device does this and then this.
+
+Making this separation clear to the user will help beginners understand when to
+use what.
+
+Here is more info on properties from
[Python](https://docs.python.org/3/library/functions.html#property).
## Design for compatibility with CPython
@@ -61,6 +72,15 @@ modules to add extra functionality. By distinguishing API boundaries at modules
you increase the likelihood that incorrect expectations are found on import and
not randomly during runtime.
+### Example
+When adding extra functionality to CircuitPython to mimic what a normal
+operating system would do, either copy an existing CPython API (for example file
+writing) or create a separate module to achieve what you want. For example,
+mounting and unmount drives is not a part of CPython so it should be done in a
+module, such as a new `filesystem`, that is only available in CircuitPython.
+That way when someone moves the code to CPython they know what parts need to be
+adapted.
+
## Document inline
Whenever possible, document your code right next to the code that implements it.
@@ -68,7 +88,11 @@ This makes it more likely to stay up to date with the implementation itself. Use
Sphinx's automodule to format these all nicely in ReadTheDocs. The cookiecutter
helps set these up.
-Use [rST](http://docutils.sourceforge.net/docs/user/rst/quickref.html) for markup.
+Use [Sphinx flavor rST](http://openalea.gforge.inria.fr/doc/openalea/doc/_build/html/source/sphinx/rest_syntax.html) for markup.
+
+Lots of documentation is a good thing but it can take a lot of space. To
+minimize the space used on disk and on load, distribute the library as both .py
+and .mpy, MicroPython and CircuitPython's bytecode format that omits comments.
### Module description
@@ -148,6 +172,9 @@ object with methods that read or write into the buffer instead of creating new
objects. `nativeio` classes are design to read and write to subsections of
buffers.
+Its ok to allocate an object to return to the user. Just beware of causing more
+than one allocation per call due to internal logic.
+
**However**, this is a memory tradeoff so do not do it for large or rarely used
buffers.