Compare commits

..

53 Commits

Author SHA1 Message Date
88eaced5a2 upm: update to version 0.1.8
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-09-03 09:39:51 +01:00
b8e1b5850c README.md: fix broken links
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-09-01 15:33:39 +01:00
e3177c260c doc: improve & complete documentation on many sensors
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-09-01 15:31:55 +01:00
3ed11d7c37 doyxgen: make layout show brief seperately
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-09-01 10:58:56 +01:00
52198840b8 max5847: add sample
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-09-01 10:57:48 +01:00
cb9d8e2339 README.md: add list of supported sensors that link to classes
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-29 15:37:11 +01:00
02fb40f058 max5847: improve documentation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-29 15:35:30 +01:00
cbe211c8cf max5847: work with std chipselect
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-29 15:35:00 +01:00
94a49a8f36 max31723: improve documentation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-28 18:03:38 +01:00
2aeb9ddea3 Doxygen: add layout file and make formatting more sensible
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-28 18:03:19 +01:00
6d239b9f63 docs: fix warnings in doc creation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-28 17:59:21 +01:00
ee2d398bfa th02:: added new humidity&temperature sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-07-04 18:01:51 +00:00
50fd1d7478 tcs3414cs:: added new color sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-27 12:40:33 +00:00
e7d811e4df gas:: added README file with MQ-N sensors type
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-26 20:43:52 +00:00
03fa37b130 mq5:: added new sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-26 20:39:58 +00:00
b5066c3d55 mq3:: added new sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-26 20:30:41 +00:00
30187ba5f9 mq2:: added new sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-26 20:23:05 +00:00
4eb6c4e19d mq9:: added new sensor
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-26 19:33:39 +00:00
0ea310ac71 package.json.in: add version to package.json files
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-26 14:17:32 +01:00
5c4de1b926 ecs1030: added new current sensor (works on atmega328 but on Galileo not accurate, need calibration and circuit)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-25 23:25:11 +00:00
59a66b41bb mlx90614: added new sensor (ir temperature), there is an issue with repeated start bit in i2c thus the sensor return incorrect data
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-20 11:09:31 +00:00
d878a5cf1a upm: update to 0.1.7
Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
2014-08-18 16:03:13 +01:00
428f4e5bfc upm: remove flag setting, move node to target only
* Fixes issue with swig and sysroots

Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
2014-08-18 15:56:38 +01:00
050c134664 lpd8806: Added new module - digital led strip (NOT TESTED)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-18 11:21:48 +00:00
ffdd6d2f00 nrf8001: added helloworld example (communicating with nrf UART application
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-13 11:49:33 +00:00
044037b892 nrf8001: added new BLE module with broadcasting example
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-12 23:40:47 +00:00
ad87704c19 grovelight.cxx: add grovelight sample code
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-12 16:53:16 +01:00
00114f69d2 grove: add documentation for grove module
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-11 14:12:23 +01:00
c99821ad26 CMakeLists.txt: fix python builds and doc building
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-11 11:31:32 +01:00
a9939d6352 max31723: use new prefixed spi MODE enum
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-08 09:52:52 +01:00
5ed36a37f9 sm130: fix std::min call having issues with template argument dedudction
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-07 20:38:45 +01:00
03b9cf89a0 CMakeLists.txt: fix builds without swig
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-07 19:23:29 +01:00
9c9b273b5a lcd: overhaul documentation for lcd module
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-07 19:15:49 +01:00
586acf7502 contributions.md: add rules for documentation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-08-07 19:15:32 +01:00
d0e83d7076 max31723: made it work with SPI but the data looks like incorrect
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-06 16:41:40 +00:00
1747fbbe19 max5487: added new sensor with example (TESTED AND WORKING)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-05 20:16:05 +00:00
45f85e9944 max31723 :: added new temperature sensor (HAVE ISSUES WITH SPI)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-04 18:01:21 +00:00
b31e88c233 maxds3231m :: added working example (set/get date and temperature)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-04 11:44:07 +00:00
58b80f6b58 maxds3231m :: fix to getTemperature method
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-08-04 12:00:58 +03:00
574a39d3c1 maxds3231m: Added new sensor support get/set data&time and get temperature (NOT TESTED YET)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-07-31 19:16:23 +03:00
bb38b35b32 sm130: Added new sensor (basic function was implemented and not tested)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
2014-07-04 15:10:09 +00:00
d15bf22536 Fix some dosctrings errors and trailing whitespaces
Signed-off-by: Kirill Luchikhin <kirill.luchikhin@intel.com>
2014-07-29 21:46:48 +04:00
731704eaac Jhd1313m1: add basic scroll functionality
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 15:25:12 +01:00
00170bea97 my9221: return mraa_error_t when method says it does
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 13:59:56 +01:00
8cfb3d3dab my9221: add direction for setBarLevel
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 13:59:19 +01:00
d2e2682f0e building.md: Adding doc on building a simple example with g++ and using pkg-config
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 10:55:17 +01:00
22ad93956c building.md: add information to rebuild only one scripting module in doc
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 10:49:17 +01:00
86a3be4517 jhd1313m1: add setColor method call to control backlight
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-14 10:48:55 +01:00
8a67c143bf mic: add carrays for uint16_t as used by mic module
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-07-03 13:42:46 +01:00
7dc8ec6244 oled-1308.cxx: replace Seed logo with Intel logo
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-06-27 04:38:20 +01:00
0d544dadeb make_oled_pic.py: script can transform an image into correct format for oled-13xx displays
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-06-27 04:37:50 +01:00
9f66c10b26 upm.i: add stdint.i to add uinstd typemaps
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-06-26 19:20:10 +01:00
2822d63c9c upm.i: add top level interface file which includes std_string.i
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2014-06-25 14:16:28 +01:00
208 changed files with 11857 additions and 287 deletions

View File

@ -20,7 +20,7 @@ include (GetGitRevisionDescription)
git_describe (VERSION "--tags")
if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND")
message (WARNING " - Install git to compile a production libmraa!")
set (VERSION "v0.1.5-dirty")
set (VERSION "v0.1.8-dirty")
endif ()
message (INFO " - UPM Version ${VERSION}")

View File

@ -99,7 +99,7 @@ BRIEF_MEMBER_DESC = YES
# brief descriptions will be completely suppressed.
# The default value is: YES.
REPEAT_BRIEF = YES
REPEAT_BRIEF = NO
# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
@ -129,6 +129,8 @@ ABBREVIATE_BRIEF = "The $name class" \
ALWAYS_DETAILED_SEC = NO
DETAILS_AT_TOP = YES
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
@ -510,7 +512,7 @@ HIDE_SCOPE_NAMES = YES
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
SHOW_INCLUDE_FILES = YES
SHOW_INCLUDE_FILES = NO
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
@ -536,7 +538,7 @@ INLINE_INFO = YES
# name. If set to NO the members will appear in declaration order.
# The default value is: YES.
SORT_MEMBER_DOCS = YES
SORT_MEMBER_DOCS = NO
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
@ -671,7 +673,7 @@ FILE_VERSION_FILTER =
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
LAYOUT_FILE =
LAYOUT_FILE = @CMAKE_CURRENT_SOURCE_DIR@/DoxygenLayout.xml
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
@ -847,7 +849,9 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
EXCLUDE_PATTERNS =
EXCLUDE_PATTERNS = @PROJECT_SOURCE_DIR@/src/nrf8001/aci* \
@PROJECT_SOURCE_DIR@/src/nrf8001/lib* \
@PROJECT_SOURCE_DIR@/src/nrf8001/hal*
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@ -886,7 +890,7 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
IMAGE_PATH =
IMAGE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/docs/images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@ -2209,7 +2213,7 @@ INCLUDE_GRAPH = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDED_BY_GRAPH = YES
INCLUDED_BY_GRAPH = NO
# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.

194
DoxygenLayout.xml Normal file
View File

@ -0,0 +1,194 @@
<doxygenlayout version="1.0">
<!-- Generated by doxygen 1.8.7 -->
<!-- Navigation index tabs for HTML output -->
<navindex>
<tab type="mainpage" visible="yes" title=""/>
<tab type="pages" visible="yes" title="" intro=""/>
<tab type="modules" visible="yes" title="" intro=""/>
<tab type="namespaces" visible="yes" title="">
<tab type="namespacelist" visible="yes" title="" intro=""/>
<tab type="namespacemembers" visible="yes" title="" intro=""/>
</tab>
<tab type="classes" visible="yes" title="">
<tab type="classlist" visible="yes" title="" intro=""/>
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="hierarchy" visible="yes" title="" intro=""/>
<tab type="classmembers" visible="yes" title="" intro=""/>
</tab>
<tab type="files" visible="yes" title="">
<tab type="filelist" visible="yes" title="" intro=""/>
<tab type="globals" visible="yes" title="" intro=""/>
</tab>
<tab type="examples" visible="yes" title="" intro=""/>
</navindex>
<!-- Layout definition for a class page -->
<class>
<briefdescription visible="yes"/>
<detaileddescription title=""/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<memberdecl>
<nestedclasses visible="yes" title=""/>
<publictypes title=""/>
<services title=""/>
<interfaces title=""/>
<publicslots title=""/>
<signals title=""/>
<publicmethods title=""/>
<publicstaticmethods title=""/>
<publicattributes title=""/>
<publicstaticattributes title=""/>
<protectedtypes title=""/>
<protectedslots title=""/>
<protectedmethods title=""/>
<protectedstaticmethods title=""/>
<protectedattributes title=""/>
<protectedstaticattributes title=""/>
<packagetypes title=""/>
<packagemethods title=""/>
<packagestaticmethods title=""/>
<packageattributes title=""/>
<packagestaticattributes title=""/>
<properties title=""/>
<events title=""/>
<privatetypes title=""/>
<privateslots title=""/>
<privatemethods title=""/>
<privatestaticmethods title=""/>
<privateattributes title=""/>
<privatestaticattributes title=""/>
<friends title=""/>
<related title="" subtitle=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<inlineclasses title=""/>
<typedefs title=""/>
<enums title=""/>
<services title=""/>
<interfaces title=""/>
<constructors title=""/>
<functions title=""/>
<related title=""/>
<variables title=""/>
<properties title=""/>
<events title=""/>
</memberdef>
<allmemberslink visible="yes"/>
<inheritancegraph visible="$CLASS_GRAPH"/>
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
<usedfiles visible="$SHOW_USED_FILES"/>
<authorsection visible="yes"/>
</class>
<!-- Layout definition for a namespace page -->
<namespace>
<briefdescription visible="yes"/>
<memberdecl>
<nestednamespaces visible="yes" title=""/>
<constantgroups visible="yes" title=""/>
<classes visible="yes" title=""/>
<typedefs title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
<membergroups visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
<memberdef>
<inlineclasses title=""/>
<typedefs title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
</memberdef>
<authorsection visible="yes"/>
</namespace>
<!-- Layout definition for a file page -->
<file>
<briefdescription visible="no"/>
<includegraph visible="$INCLUDE_GRAPH"/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<detaileddescription title="API Description"/>
<sourcelink visible="yes"/>
<memberdecl>
<classes visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<functions title=""/>
<constantgroups visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<variables title=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<inlineclasses title=""/>
<functions title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<variables title=""/>
</memberdef>
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
<authorsection/>
</file>
<!-- Layout definition for a group page -->
<group>
<briefdescription visible="yes"/>
<groupgraph visible="$GROUP_GRAPHS"/>
<memberdecl>
<nestedgroups visible="yes" title=""/>
<dirs visible="yes" title=""/>
<files visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<classes visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
<variables title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
<membergroups visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
<memberdef>
<pagedocs/>
<inlineclasses title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
<variables title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
</memberdef>
<authorsection visible="yes"/>
</group>
<!-- Layout definition for a directory page -->
<directory>
<briefdescription visible="yes"/>
<directorygraph visible="yes"/>
<memberdecl>
<dirs visible="yes"/>
<files visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
</directory>
</doxygenlayout>

View File

@ -21,6 +21,57 @@ However implementation and API design is compeltely up to the developer, some
enumerable sensors for example may provide much clever instanciation. Displays
may also create more complex structures in order to interface with them.
### Supported Sensors
Temperature Sensors:
* upm::MAX31723
* upm::MAX31855
* upm::TH02
* upm::GroveTemp
Compass/Gyro/Magnometer Sensors:
* upm::Hmc5883l
* upm::MPU9150
Atmospheric Pressure Sensors:
* upm::GY65
Light/Proximity Sensors:
* upm::MAXDS3231M
* upm::MAX44000
* upm::HCSR04
* upm::GroveLight
Gas Sensors:
* upm::MQ2
* upm::MQ3
* upm::MQ5
* upm::MQ9
Displays:
* upm::Jhd1313m1
* upm::Lcm1602
* upm::ST7735
* upm::SSD1308
* upm::SSD1327
LED controllers/segment displays:
* upm::TM1637
* upm::MY9221
RFID:
* upm::SM130
Wireless Communication:
* upm::NRF24l01
Servo/motors:
* upm::ES08A
* upm::StepMotor
Digital potentiometer
* upm::MAX5487
### Building UPM
See @ref building

27
TODO Normal file
View File

@ -0,0 +1,27 @@
Easy:
MAX7221 - SPI 8 digit LED
- https://mbed.org/components/MAX7221/
-
SCA61T - inclinometer SPI
- https://mbed.org/components/SCA61T-Inclinometer/
DS1721 - i2c temperature/thermostat
- https://mbed.org/components/DS1721/
MPL3115A2 - i2c altimeter
- https://mbed.org/components/MPL3115A2/
- http://www.ebay.co.uk/itm/Barometric-Pressure-Altitude-Temperature-Sensor-I2C-MPL3115A2-/221499210102?pt=UK_BOI_Electrical_Test_Measurement_Equipment_ET&hash=item339261b976
TEMT6200 - Ambient light sensor
- https://mbed.org/components/TEMT6200/
CMPS03 - i2c digital compass
- https://mbed.org/components/CMPS03-Digital-Compass/
- http://www.ebay.co.uk/itm/Magnetic-Compass-CMPS03-/221437925374?pt=UK_BOI_Electrical_Test_Measurement_Equipment_ET&hash=item338eba97fe
- http://www.robot-italy.com/it/cmps03-robot-compass-module.html
Medium
E-ink sharp 1.3" LCD
- https://mbed.org/components/13-SHARP-Memory-LCD/
LCD-S401
- https://mbed.org/components/Lumex-LCD-S401/
Hard:
RA8875 - 480x272 SPI 4 wire
- https://mbed.org/components/RA8875-Based-Display/

View File

@ -29,3 +29,31 @@ Building debug build:
Using clang instead of gcc:
-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang
Often developers are only interested in building one module or even just the
python/node module to do some quick testing using scripting. In order to do
this you need to use the target name for the python or node module you want to
rebuild. For example the lcd module target name is i2clcd. Therfore the python
module target name will be prefixed by _pyupm_. Just do the following to build
only that module. Modules not using the UPM cmake macros may have different
naming.
~~~~~~~~~~~~~
make _pyupm_i2clcd
~~~~~~~~~~~~~
Sometimes you want to build a small C++ example against an installed library.
This is fairly easy if installed systemwide. Just link against the correct
librar (in this case libupm-tm1637) and then add /usr/include/upm to the loader
path:
~~~~~~~~~~~~
g++ test.cxx -lupm_tm1637 -I/usr/include/upm
~~~~~~~~~~~~
You can also use pkg-config to return the information to you, which is
considered the correct way if including UPM in a build system like cmake or
autotools on linux.
~~~~~~~~~~~
pkg-config --cflags --libs upm-tm1637
~~~~~~~~~~~

View File

@ -2,15 +2,33 @@ Contributing a module {#contributions}
=====================
Here are the rules of contribution:
- Try not to break master. In any commit.
- Your module must have an example that builds against your UPM library
- Commits must have a sign-off line by everyone who reviewed them
- Commits must be named <file/module>: Some decent description
- You must license your module under an FOSS license. The recommended license
- You must license your module under a FOSS license. The recommended license
is MIT but any permissive license is fine. Please consider that people using
UPM may want to write proprietary programs with your sensors so we like to
avoid GPL. (LGPL is fine). If your license is not MIT please include a
LICENSE file in src/<mymodule>/
LICENSE file in src/mymodule/
- Please test your module builds before contributing and make sure it works on
the latest version of mraa. If you tested on a specific board/platform please
tell us what this was in your PR.
- Try not to break master. In any commit.
- Attempt to have some decent API documentation below are the explicit rules on documentation:
Documentation
=============
- Try to have no warnings in doxygen, this is generally fairly easy
- Have the specific sensor manufacturer/model & version that you used, if you
support multiple versions please list
- Comments do not need full stops
- Stick to <80 chars per line even in comments
- No text is allowed on the same line as the start or end of a comment /** */
- All classes should have a "@brief" and a "@snippet"
The example should have an 'Interesting' section which will be highlighted as a
code sample in doxygen. Everything in between such tags will show up in the
class documentation when the following is put at the end of a class docstring
as show above.

BIN
docs/images/grovegas.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
docs/images/lcm1602.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/images/lpd8806.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
docs/images/max31723.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/images/max31855.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
docs/images/max44000.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/images/max5487.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
docs/images/mq9.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
docs/images/ssd1308.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
docs/images/ssd1327.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -31,7 +31,8 @@ change between the javascript & node.js one is the argument to %module.
The %include parameter defines which functions will be available to the
node/python module created, Whilst the headers inside %{} will be explicitly
required during compilation. Typically only the top level header is required in
either of those args.
either of those args. The upm.i is just a shortcut to include some commonly
used swig wrappers for UPM sensors, it's not obligatory but recommended.
### API
@ -92,5 +93,5 @@ target_link_libraries (max31855-example max31855 ${CMAKE_THREAD_LIBS_INIT})
~~~~~~~~~~~
Note you dont have to rebuild everything, cmake keeps target lists so if you
named your example target <modulename>-example you can simply do make
named your example target modulename-example you can simply do make
max31855-example and both the library & example will build.

View File

@ -9,13 +9,13 @@ example is explained in detail on @ref max31855
### Adding a new module to UPM
1. Choose a name for your module (see @ref naming)
2. Make a new folder in src/<modulename>
3. Create a CMakeLists.txt file inside src/<modulename>
2. Make a new folder in src/modulename
3. Create a CMakeLists.txt file inside src/modulename
### CmakeLists.txt
By default you need a header called <modulename>.h and a C++ file called
<modulename>.cxx. You can have multiple headers and source files. Only public
By default you need a header called modulename.h and a C++ file called
modulename.cxx. You can have multiple headers and source files. Only public
headers need to be added to module_h and all source files need to be in
module_src.
@ -60,6 +60,6 @@ The last step is when you're happy with your module and it works send us a pull
request! We'd love to include your sensor in our repository.
If you don't like github you can also send brendan.le.foll@intel.com a git
formatted patch if your sensor. More details are on @ref contributing and on
formatted patch if your sensor. More details are on @ref contributions and on
https://help.github.com/articles/creating-a-pull-request

View File

@ -21,6 +21,20 @@ add_executable (stepmotor-example stepmotor.cxx)
add_executable (pulsensor-example pulsensor.cxx)
add_executable (mic-example mic-example.cxx)
add_executable (mpu9150-example mpu9150-example.cxx)
add_executable (maxds3231m-example maxds3231m.cxx)
add_executable (max31723-example max31723.cxx)
add_executable (max5487-example max5487.cxx)
add_executable (nrf8001-broadcast-example nrf8001_broadcast.cxx)
add_executable (nrf8001-helloworld-example nrf8001_helloworld.cxx)
add_executable (lpd8806-example lpd8806-example.cxx)
add_executable (mlx90614-example mlx90614-example.cxx)
add_executable (ecs1030-example ecs1030-example.cxx)
add_executable (mq2-example mq2-example.cxx)
add_executable (mq3-example mq3-example.cxx)
add_executable (mq5-example mq5-example.cxx)
add_executable (mq9-example mq9-example.cxx)
add_executable (tcs3414cs-example tcs3414cs-example.cxx)
add_executable (th02-example th02-example.cxx)
include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l)
include_directories (${PROJECT_SOURCE_DIR}/src/grove)
@ -40,6 +54,16 @@ include_directories (${PROJECT_SOURCE_DIR}/src/stepmotor)
include_directories (${PROJECT_SOURCE_DIR}/src/pulsensor)
include_directories (${PROJECT_SOURCE_DIR}/src/mic)
include_directories (${PROJECT_SOURCE_DIR}/src/mpu9150)
include_directories (${PROJECT_SOURCE_DIR}/src/maxds3231m)
include_directories (${PROJECT_SOURCE_DIR}/src/max31723)
include_directories (${PROJECT_SOURCE_DIR}/src/max5487)
include_directories (${PROJECT_SOURCE_DIR}/src/nrf8001)
include_directories (${PROJECT_SOURCE_DIR}/src/lpd8806)
include_directories (${PROJECT_SOURCE_DIR}/src/mlx90614)
include_directories (${PROJECT_SOURCE_DIR}/src/ecs1030)
include_directories (${PROJECT_SOURCE_DIR}/src/gas)
include_directories (${PROJECT_SOURCE_DIR}/src/tcs3414cs)
include_directories (${PROJECT_SOURCE_DIR}/src/th02)
target_link_libraries (compass hmc5883l ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (groveled grove ${CMAKE_THREAD_LIBS_INIT})
@ -64,3 +88,17 @@ target_link_libraries (stepmotor-example stepmotor ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (pulsensor-example pulsensor ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mic-example mic ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mpu9150-example mpu9150 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (maxds3231m-example maxds3231m ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (max31723-example max31723 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (max5487-example max5487 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (nrf8001-broadcast-example nrf8001 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (nrf8001-helloworld-example nrf8001 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (lpd8806-example lpd8806 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mlx90614-example mlx90614 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (ecs1030-example ecs1030 ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mq2-example gas ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mq3-example gas ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mq5-example gas ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (mq9-example gas ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (tcs3414cs-example tcs3414cs ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (th02-example th02 ${CMAKE_THREAD_LIBS_INIT})

View File

@ -0,0 +1,61 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include <signal.h>
#include <stdlib.h>
#include "ecs1030.h"
int is_running = 0;
upm::ECS1030 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
is_running = 1;
}
}
//! [Interesting]
int
main(int argc, char **argv)
{
sensor = new upm::ECS1030(0);
signal(SIGINT, sig_handler);
while (!is_running) {
std::cout << "I = " << sensor->getCurrency_A () << ", Power = " << sensor->getPower_A () << std::endl;
std::cout << "I = " << sensor->getCurrency_B () << ", Power = " << sensor->getPower_B () << std::endl;
}
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
//! [Interesting]

View File

@ -29,7 +29,7 @@
int
main(int argc, char **argv)
{
// Use i2c device 0 all the time
//! [Interesting]
upm::GroveLed* led = new upm::GroveLed(2);
std::cout << led->name() << std::endl;
for (int i=0; i < 10; i++) {
@ -38,6 +38,7 @@ main(int argc, char **argv)
led->off();
sleep(1);
}
//! [Interesting]
return 0;
}

40
examples/grovelight.cxx Normal file
View File

@ -0,0 +1,40 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "grove.h"
int
main(int argc, char **argv)
{
// This example uses AIO 0
//! [Interesting]
upm::GroveLight* light = new upm::GroveLight(0);
int lightValue = light->value();
delete light;
//! [Interesting]
return 0;
}

View File

@ -29,13 +29,14 @@
int
main(int argc, char **argv)
{
// Use i2c device 0 all the time
//! [Interesting]
upm::GroveTemp* s = new upm::GroveTemp(0);
std::cout << s->name() << std::endl;
for (int i=0; i < 10; i++) {
std::cout << s->value() << std::endl;
sleep(1);
}
//! [Interesting]
return 0;
}

View File

@ -27,9 +27,11 @@
int
main(int argc, char **argv)
{
//! [Interesting]
upm::Lcm1602* lcd = new upm::Lcm1602(0, 0x27);
lcd->setCursor(0,0);
lcd->write("Hello World");
//! [Interesting]
lcd->setCursor(1,2);
lcd->write("Hello World");
lcd->setCursor(2,4);

View File

@ -0,0 +1,104 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "lpd8806.h"
#include <signal.h>
void scanner(uint8_t r, uint8_t g, uint8_t b, uint8_t wait);
int doWork = 0;
upm::LPD8806 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
sensor = new upm::LPD8806(10, 7);
usleep (1000000);
sensor->show ();
while (!doWork) {
// Back-and-forth lights
scanner(127, 0, 0, 30); // red, slow
scanner(0, 0, 127, 15); // blue, fast
usleep (1000000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
void scanner(uint8_t r, uint8_t g, uint8_t b, uint8_t wait) {
int i, j, pos, dir;
pos = 0;
dir = 1;
for(i=0; i < ((sensor->getStripLength() - 1) * 8); i++) {
// Draw 5 pixels centered on pos. setPixelColor() will clip
// any pixels off the ends of the strip, no worries there.
// we'll make the colors dimmer at the edges for a nice pulse
// look
sensor->setPixelColor(pos - 2, r/4, g/4, b/4);
sensor->setPixelColor(pos - 1, r/2, g/2, b/2);
sensor->setPixelColor(pos, r, g, b);
sensor->setPixelColor(pos + 1, r/2, g/2, b/2);
sensor->setPixelColor(pos + 2, r/4, g/4, b/4);
sensor->show();
usleep (wait * 1000);
// If we wanted to be sneaky we could erase just the tail end
// pixel, but it's much easier just to erase the whole thing
// and draw a new one next time.
for(j=-2; j<= 2; j++) {
sensor->setPixelColor(pos+j, 0,0,0);
}
// Bounce off ends of strip
pos += dir;
if(pos < 0) {
pos = 1;
dir = -dir;
} else if (pos >= sensor->getStripLength()) {
pos = sensor->getStripLength() - 2;
dir = -dir;
}
}
}

61
examples/max31723.cxx Normal file
View File

@ -0,0 +1,61 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "max31723.h"
#include <signal.h>
int doWork = 0;
upm::MAX31723 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
sensor = new upm::MAX31723(7);
usleep (1000000);
while (!doWork) {
std::cout << "Temperature " << sensor->getTemperature() << std::endl;
usleep (1000000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

66
examples/max5487.cxx Normal file
View File

@ -0,0 +1,66 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "max5487.h"
#include <signal.h>
upm::MAX5487 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
sensor = new upm::MAX5487(7);
// Power LED UP
for (int i = 0; i < 255; i++) {
sensor->setWiperA(i);
usleep (5000);
}
// Power LED DOWN
for (int i = 0; i < 255; i++) {
sensor->setWiperA(255 - i);
usleep (5000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

75
examples/maxds3231m.cxx Normal file
View File

@ -0,0 +1,75 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "maxds3231m.h"
#include <signal.h>
int doWork = 0;
upm::MAXDS3231M *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
upm::Time3231 t;
sensor = new upm::MAXDS3231M(0, ADDR);
t.second = 1;
t.minute = 3;
t.hour = 3;
t.day = 3;
t.month = 3;
t.year = 3;
t.weekDay = 3;
sensor->setDate (t); // Note, second should be set to 1.
usleep (500000);
while (!doWork) {
if (sensor->getDate (t)) {
std::cout << (int)t.hour << ":" << (int)t.minute << ":" << (int)t.second << std::endl;
}
std::cout << "Temperature " << sensor->getTemperature() << std::endl;
usleep (1000000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

View File

@ -0,0 +1,60 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "mlx90614.h"
#include <signal.h>
int doWork = 0;
upm::MLX90614 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
sensor = new upm::MLX90614(0, DEVICE_ADDR);
while (!doWork) {
std::cout << "Object Temperature (" << sensor->readObjectTempC() << ") Ambient Temperature (" << sensor->readAmbientTempC() << ")" << std::endl;
usleep (1000000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

74
examples/mq2-example.cxx Normal file
View File

@ -0,0 +1,74 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "mq2.h"
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
int is_running = 0;
uint16_t buffer [128];
upm::MQ2 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
is_running = 1;
}
}
//! [Interesting]
int
main(int argc, char **argv)
{
sensor = new upm::MQ2(0);
signal(SIGINT, sig_handler);
thresholdContext ctx;
ctx.averageReading = 0;
ctx.runningAverage = 0;
ctx.averagedOver = 2;
while (!is_running) {
int len = sensor->getSampledWindow (2, 128, buffer);
if (len) {
int thresh = sensor->findThreshold (&ctx, 30, buffer, len);
sensor->printGraph(&ctx, 5);
if (thresh) {
// do something ....
}
}
}
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
//! [Interesting]

74
examples/mq3-example.cxx Normal file
View File

@ -0,0 +1,74 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "mq3.h"
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
int is_running = 0;
uint16_t buffer [128];
upm::MQ3 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
is_running = 1;
}
}
//! [Interesting]
int
main(int argc, char **argv)
{
sensor = new upm::MQ3(0);
signal(SIGINT, sig_handler);
thresholdContext ctx;
ctx.averageReading = 0;
ctx.runningAverage = 0;
ctx.averagedOver = 2;
while (!is_running) {
int len = sensor->getSampledWindow (2, 128, buffer);
if (len) {
int thresh = sensor->findThreshold (&ctx, 30, buffer, len);
sensor->printGraph(&ctx, 5);
if (thresh) {
// do something ....
}
}
}
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
//! [Interesting]

74
examples/mq5-example.cxx Normal file
View File

@ -0,0 +1,74 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "mq5.h"
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
int is_running = 0;
uint16_t buffer [128];
upm::MQ5 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
is_running = 1;
}
}
//! [Interesting]
int
main(int argc, char **argv)
{
sensor = new upm::MQ5(0);
signal(SIGINT, sig_handler);
thresholdContext ctx;
ctx.averageReading = 0;
ctx.runningAverage = 0;
ctx.averagedOver = 2;
while (!is_running) {
int len = sensor->getSampledWindow (2, 128, buffer);
if (len) {
int thresh = sensor->findThreshold (&ctx, 30, buffer, len);
sensor->printGraph(&ctx, 7);
if (thresh) {
// do something ....
}
}
}
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
//! [Interesting]

74
examples/mq9-example.cxx Normal file
View File

@ -0,0 +1,74 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "mq9.h"
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
int is_running = 0;
uint16_t buffer [128];
upm::MQ9 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
is_running = 1;
}
}
//! [Interesting]
int
main(int argc, char **argv)
{
sensor = new upm::MQ9(0);
signal(SIGINT, sig_handler);
thresholdContext ctx;
ctx.averageReading = 0;
ctx.runningAverage = 0;
ctx.averagedOver = 2;
while (!is_running) {
int len = sensor->getSampledWindow (2, 128, buffer);
if (len) {
int thresh = sensor->findThreshold (&ctx, 30, buffer, len);
sensor->printGraph(&ctx, 5);
if (thresh) {
// do something ....
}
}
}
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}
//! [Interesting]

View File

@ -0,0 +1,177 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "nrf8001.h"
#include "nrf8001_broadcast.h"
#include <lib_aci.h>
#include <aci_setup.h>
#include <signal.h>
#ifdef SERVICES_PIPE_TYPE_MAPPING_CONTENT
static services_pipe_type_mapping_t
services_pipe_type_mapping[NUMBER_OF_PIPES] = SERVICES_PIPE_TYPE_MAPPING_CONTENT;
#else
#define NUMBER_OF_PIPES 0
static services_pipe_type_mapping_t * services_pipe_type_mapping = NULL;
#endif
/**
* Store the setup for the nRF8001 in the flash of the AVR to save on RAM
*/
static hal_aci_data_t setup_msgs[NB_SETUP_MESSAGES] = SETUP_MESSAGES_CONTENT;
/**
* aci_struct that will contain
* total initial credits
* current credit
* current state of the aci (setup/standby/active/sleep)
* open remote pipe pending
* close remote pipe pending
* Current pipe available bitmap
* Current pipe closed bitmap
* Current connection interval, slave latency and link supervision timeout
* Current State of the the GATT client (Service Discovery)
* Status of the bond (R) Peer address
*/
static struct aci_state_t aci_state;
/**
* Temporary buffers for sending ACI commands
*/
static hal_aci_evt_t aci_data;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
}
}
void
init_aci_setup () {
/**
* Point ACI data structures to the the setup data that the nRFgo studio generated for the nRF8001
*/
if (NULL != services_pipe_type_mapping) {
aci_state.aci_setup_info.services_pipe_type_mapping = &services_pipe_type_mapping[0];
} else {
aci_state.aci_setup_info.services_pipe_type_mapping = NULL;
}
aci_state.aci_setup_info.number_of_pipes = NUMBER_OF_PIPES;
aci_state.aci_setup_info.setup_msgs = setup_msgs;
aci_state.aci_setup_info.num_setup_msgs = NB_SETUP_MESSAGES;
}
int
main(int argc, char **argv)
{
//! [Interesting]
init_aci_setup ();
init_local_interfaces (&aci_state, 10, 8, 4);
while (1) {
static bool setup_required = false;
if (lib_aci_event_get (&aci_state, &aci_data)) {
aci_evt_t * aci_evt;
aci_evt = &aci_data.evt;
switch(aci_evt->evt_opcode) {
/**
As soon as you reset the nRF8001 you will get an ACI Device Started Event
*/
case ACI_EVT_DEVICE_STARTED: {
aci_state.data_credit_available = aci_evt->params.device_started.credit_available;
switch(aci_evt->params.device_started.device_mode) {
case ACI_DEVICE_SETUP:
/**
When the device is in the setup mode
*/
printf ("Evt Device Started: Setup\n");
setup_required = true;
break;
case ACI_DEVICE_STANDBY:
printf ("Evt Device Started: Standby\n");
lib_aci_broadcast(10/* in seconds */, 0x0100 /* advertising interval 100ms */);
printf ("Broadcasting started\n");
break;
}
}
break; //ACI Device Started Event
case ACI_EVT_CMD_RSP:
if (ACI_STATUS_SUCCESS != aci_evt->params.cmd_rsp.cmd_status) {
printf ("ACI_EVT_CMD_RSP\n");
while (1);
}
break;
case ACI_EVT_CONNECTED:
printf ("ACI_EVT_CONNECTED\n");
break;
case ACI_EVT_PIPE_STATUS:
printf ("ACI_EVT_PIPE_STATUS\n");
break;
case ACI_EVT_DISCONNECTED:
if (ACI_STATUS_ERROR_ADVT_TIMEOUT == aci_evt->params.disconnected.aci_status) {
printf ("Broadcasting timed out\n");
} else {
printf ("Evt Disconnected. Link Loss\n");
}
break;
case ACI_EVT_DATA_RECEIVED:
printf ("ACI_EVT_DATA_RECEIVED\n");
break;
case ACI_EVT_HW_ERROR:
printf ("ACI_EVT_HW_ERROR\n");
break;
}
}
if (setup_required) {
if (SETUP_SUCCESS == do_aci_setup(&aci_state)) {
setup_required = false;
}
}
usleep (100);
}
close_local_interfaces (&aci_state);
//! [Interesting]
std::cout << "exiting application" << std::endl;
return 0;
}

View File

@ -0,0 +1,93 @@
#include "hal_platform.h"
#include "aci.h"
#pragma once
#define PIPE_GAP_DEVICE_NAME_SET 1
#define NUMBER_OF_PIPES 1
#define SERVICES_PIPE_TYPE_MAPPING_CONTENT {\
{ACI_STORE_LOCAL, ACI_SET}, \
}
#define GAP_PPCP_MAX_CONN_INT 0xffff /**< Maximum connection interval as a multiple of 1.25 msec , 0xFFFF means no specific value requested */
#define GAP_PPCP_MIN_CONN_INT 0xffff /**< Minimum connection interval as a multiple of 1.25 msec , 0xFFFF means no specific maximum*/
#define GAP_PPCP_SLAVE_LATENCY 0
#define GAP_PPCP_CONN_TIMEOUT 0xffff /** Connection Supervision timeout multiplier as a multiple of 10msec, 0xFFFF means no specific value requested */
#define NB_SETUP_MESSAGES 13
#define SETUP_MESSAGES_CONTENT {\
{0x00,\
{\
0x07,0x06,0x00,0x00,0x03,0x02,0x41,0xd7,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x06,0x00,0x01,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x10,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x90,0x00,0x64,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x10,0x38,0x02,0xff,0x02,0x58,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
},\
},\
{0x00,\
{\
0x05,0x06,0x10,0x54,0x00,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x00,0x04,0x04,0x02,0x02,0x00,0x01,0x28,0x00,0x01,0x00,0x18,0x04,0x04,0x05,0x05,0x00,\
0x02,0x28,0x03,0x01,0x0e,0x03,0x00,0x00,0x2a,0x04,0x14,0x0b,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x1c,0x05,0x00,0x03,0x2a,0x00,0x01,0x62,0x63,0x61,0x73,0x74,0x63,0x73,0x65,0x6d,0x69,\
0x2e,0x04,0x04,0x05,0x05,0x00,0x04,0x28,0x03,0x01,0x02,0x05,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x38,0x00,0x01,0x2a,0x06,0x04,0x03,0x02,0x00,0x05,0x2a,0x01,0x01,0x00,0x00,0x04,0x04,\
0x05,0x05,0x00,0x06,0x28,0x03,0x01,0x02,0x07,0x00,0x04,0x2a,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x54,0x06,0x04,0x09,0x08,0x00,0x07,0x2a,0x04,0x01,0xff,0xff,0xff,0xff,0x00,0x00,0xff,\
0xff,0x04,0x04,0x02,0x02,0x00,0x08,0x28,0x00,0x01,0x01,0x18,\
},\
},\
{0x00,\
{\
0x04,0x06,0x20,0x70,0x00,\
},\
},\
{0x00,\
{\
0x0d,0x06,0x40,0x00,0x2a,0x00,0x01,0x00,0x80,0x04,0x00,0x03,0x00,0x00,\
},\
},\
{0x00,\
{\
0x06,0x06,0x60,0x00,0x00,0x00,0x00,\
},\
},\
{0x00,\
{\
0x06,0x06,0xf0,0x00,0x03,0x4c,0xf2,\
},\
},\
}

View File

@ -0,0 +1,362 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "nrf8001.h"
#include "nrf8001_helloworld.h"
#include <lib_aci.h>
#include <aci_setup.h>
#include <signal.h>
#include "uart_over_ble.h"
/*
* You can use the nRF UART app in the Apple iOS app store and Google Play for Android 4.3 for Samsung Galaxy S4
* with this helloworld application
*/
#ifdef SERVICES_PIPE_TYPE_MAPPING_CONTENT
static services_pipe_type_mapping_t
services_pipe_type_mapping[NUMBER_OF_PIPES] = SERVICES_PIPE_TYPE_MAPPING_CONTENT;
#else
#define NUMBER_OF_PIPES 0
static services_pipe_type_mapping_t * services_pipe_type_mapping = NULL;
#endif
/**
* Store the setup for the nRF8001 in the flash of the AVR to save on RAM
*/
static hal_aci_data_t setup_msgs[NB_SETUP_MESSAGES] = SETUP_MESSAGES_CONTENT;
/**
* aci_struct that will contain
* total initial credits
* current credit
* current state of the aci (setup/standby/active/sleep)
* open remote pipe pending
* close remote pipe pending
* Current pipe available bitmap
* Current pipe closed bitmap
* Current connection interval, slave latency and link supervision timeout
* Current State of the the GATT client (Service Discovery)
* Status of the bond (R) Peer address
*/
static struct aci_state_t aci_state;
/**
* Temporary buffers for sending ACI commands
*/
static hal_aci_evt_t aci_data;
/*
Timing change state variable
*/
static bool timing_change_done = false;
/*
Used to test the UART TX characteristic notification
*/
static uart_over_ble_t uart_over_ble;
static uint8_t uart_buffer[20];
static uint8_t uart_buffer_len = 0;
static uint8_t dummychar = 0;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
}
}
void
init_aci_setup () {
/**
* Point ACI data structures to the the setup data that the nRFgo studio generated for the nRF8001
*/
if (NULL != services_pipe_type_mapping) {
aci_state.aci_setup_info.services_pipe_type_mapping = &services_pipe_type_mapping[0];
} else {
aci_state.aci_setup_info.services_pipe_type_mapping = NULL;
}
aci_state.aci_setup_info.number_of_pipes = NUMBER_OF_PIPES;
aci_state.aci_setup_info.setup_msgs = setup_msgs;
aci_state.aci_setup_info.num_setup_msgs = NB_SETUP_MESSAGES;
}
void
uart_over_ble_init (void) {
uart_over_ble.uart_rts_local = true;
}
bool
uart_tx (uint8_t *buffer, uint8_t buffer_len) {
bool status = false;
if (lib_aci_is_pipe_available(&aci_state, PIPE_UART_OVER_BTLE_UART_TX_TX) &&
(aci_state.data_credit_available >= 1)) {
status = lib_aci_send_data(PIPE_UART_OVER_BTLE_UART_TX_TX, buffer, buffer_len);
if (status) {
aci_state.data_credit_available--;
}
}
return status;
}
bool
uart_process_control_point_rx(uint8_t *byte, uint8_t length) {
bool status = false;
aci_ll_conn_params_t *conn_params;
if (lib_aci_is_pipe_available(&aci_state, PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_TX) ) {
switch (*byte) {
/*
Queues a ACI Disconnect to the nRF8001 when this packet is received.
May cause some of the UART packets being sent to be dropped
*/
case UART_OVER_BLE_DISCONNECT:
/*
Parameters:
None
*/
lib_aci_disconnect(&aci_state, ACI_REASON_TERMINATE);
status = true;
break;
/*
Queues an ACI Change Timing to the nRF8001
*/
case UART_OVER_BLE_LINK_TIMING_REQ:
/*
Parameters:
Connection interval min: 2 bytes
Connection interval max: 2 bytes
Slave latency: 2 bytes
Timeout: 2 bytes
Same format as Peripheral Preferred Connection Parameters (See nRFgo studio -> nRF8001 Configuration -> GAP Settings
Refer to the ACI Change Timing Request in the nRF8001 Product Specifications
*/
conn_params = (aci_ll_conn_params_t *)(byte+1);
lib_aci_change_timing( conn_params->min_conn_interval,
conn_params->max_conn_interval,
conn_params->slave_latency,
conn_params->timeout_mult);
status = true;
break;
/*
Clears the RTS of the UART over BLE
*/
case UART_OVER_BLE_TRANSMIT_STOP:
/*
Parameters:
None
*/
uart_over_ble.uart_rts_local = false;
status = true;
break;
/*
Set the RTS of the UART over BLE
*/
case UART_OVER_BLE_TRANSMIT_OK:
/*
Parameters:
None
*/
uart_over_ble.uart_rts_local = true;
status = true;
break;
}
}
return status;
}
int
main(int argc, char **argv)
{
//! [Interesting]
init_aci_setup ();
init_local_interfaces (&aci_state, 10, 8, 4);
while (1) {
static bool setup_required = false;
// We enter the if statement only when there is a ACI event available to be processed
if (lib_aci_event_get(&aci_state, &aci_data)) {
aci_evt_t * aci_evt;
aci_evt = &aci_data.evt;
switch(aci_evt->evt_opcode) {
/**
As soon as you reset the nRF8001 you will get an ACI Device Started Event
*/
case ACI_EVT_DEVICE_STARTED: {
aci_state.data_credit_total = aci_evt->params.device_started.credit_available;
switch(aci_evt->params.device_started.device_mode) {
case ACI_DEVICE_SETUP:
/**
When the device is in the setup mode
*/
printf ("Evt Device Started: Setup \n");
setup_required = true;
break;
case ACI_DEVICE_STANDBY:
printf ("Evt Device Started: Standby \n");
// Looking for an iPhone by sending radio advertisements
// When an iPhone connects to us we will get an ACI_EVT_CONNECTED event from the nRF8001
if (aci_evt->params.device_started.hw_error) {
usleep (20000); //Handle the HW error event correctly.
} else {
lib_aci_connect(0/* in seconds : 0 means forever */, 0x0050 /* advertising interval 50ms*/);
printf ("Advertising started \n");
}
break;
}
}
break; // ACI Device Started Event
case ACI_EVT_CMD_RSP:
//If an ACI command response event comes with an error -> stop
if (ACI_STATUS_SUCCESS != aci_evt->params.cmd_rsp.cmd_status) {
//ACI ReadDynamicData and ACI WriteDynamicData will have status codes of
//TRANSACTION_CONTINUE and TRANSACTION_COMPLETE
//all other ACI commands will have status code of ACI_STATUS_SCUCCESS for a successful command
printf ("ACI_EVT_CMD_RSP \n");
}
if (ACI_CMD_GET_DEVICE_VERSION == aci_evt->params.cmd_rsp.cmd_opcode) {
//Store the version and configuration information of the nRF8001 in the Hardware Revision String Characteristic
lib_aci_set_local_data(&aci_state, PIPE_DEVICE_INFORMATION_HARDWARE_REVISION_STRING_SET,
(uint8_t *)&(aci_evt->params.cmd_rsp.params.get_device_version), sizeof(aci_evt_cmd_rsp_params_get_device_version_t));
}
break;
case ACI_EVT_CONNECTED:
printf ("ACI_EVT_CONNECTED");
uart_over_ble_init ();
timing_change_done = false;
aci_state.data_credit_available = aci_state.data_credit_total;
/*
Get the device version of the nRF8001 and store it in the Hardware Revision String
*/
lib_aci_device_version();
break;
case ACI_EVT_PIPE_STATUS:
printf ("ACI_EVT_PIPE_STATUS \n");
if (lib_aci_is_pipe_available(&aci_state, PIPE_UART_OVER_BTLE_UART_TX_TX) && (false == timing_change_done)) {
lib_aci_change_timing_GAP_PPCP(); // change the timing on the link as specified in the nRFgo studio -> nRF8001 conf. -> GAP.
// Used to increase or decrease bandwidth
timing_change_done = true;
char hello[]="Hello World, works";
uart_tx((uint8_t *)&hello[0], strlen(hello));
}
break;
case ACI_EVT_TIMING:
printf ("Evt link connection interval changed \n");
lib_aci_set_local_data(&aci_state,
PIPE_UART_OVER_BTLE_UART_LINK_TIMING_CURRENT_SET,
(uint8_t *)&(aci_evt->params.timing.conn_rf_interval), /* Byte aligned */
PIPE_UART_OVER_BTLE_UART_LINK_TIMING_CURRENT_SET_MAX_SIZE);
break;
case ACI_EVT_DISCONNECTED:
printf ("ACI_EVT_DISCONNECTED \n");
lib_aci_connect(0/* in seconds : 0 means forever */, 0x0050 /* advertising interval 50ms*/);
printf ("Advertising started \n");
break;
case ACI_EVT_DATA_RECEIVED:
if (PIPE_UART_OVER_BTLE_UART_RX_RX == aci_evt->params.data_received.rx_data.pipe_number) {
for(int i=0; i<aci_evt->len - 2; i++) {
uart_buffer[i] = aci_evt->params.data_received.rx_data.aci_data[i];
}
uart_buffer_len = aci_evt->len - 2;
if (lib_aci_is_pipe_available(&aci_state, PIPE_UART_OVER_BTLE_UART_TX_TX)) {
}
}
if (PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_RX == aci_evt->params.data_received.rx_data.pipe_number) {
//Subtract for Opcode and Pipe number
uart_process_control_point_rx(&aci_evt->params.data_received.rx_data.aci_data[0], aci_evt->len - 2);
}
printf ("Incomming data - %s\n", uart_buffer);
break;
case ACI_EVT_DATA_CREDIT:
printf ("ACI_EVT_DATA_CREDIT \n");
aci_state.data_credit_available = aci_state.data_credit_available + aci_evt->params.data_credit.credit;
break;
case ACI_EVT_PIPE_ERROR:
printf ("ACI_EVT_PIPE_ERROR \n");
//Increment the credit available as the data packet was not sent.
//The pipe error also represents the Attribute protocol Error Response sent from the peer and that should not be counted
//for the credit.
if (ACI_STATUS_ERROR_PEER_ATT_ERROR != aci_evt->params.pipe_error.error_code) {
aci_state.data_credit_available++;
}
break;
case ACI_EVT_HW_ERROR:
printf ("ACI_EVT_HW_ERROR \n");
lib_aci_connect(0/* in seconds, 0 means forever */, 0x0050 /* advertising interval 50ms*/);
printf ("Advertising started \n");
break;
}
}
/* setup_required is set to true when the device starts up and enters setup mode.
* It indicates that do_aci_setup() should be called. The flag should be cleared if
* do_aci_setup() returns ACI_STATUS_TRANSACTION_COMPLETE.
*/
if(setup_required) {
if (SETUP_SUCCESS == do_aci_setup(&aci_state)) {
setup_required = false;
}
}
usleep (100);
}
close_local_interfaces (&aci_state);
//! [Interesting]
std::cout << "exiting application" << std::endl;
return 0;
}

View File

@ -0,0 +1,254 @@
#include "hal_platform.h"
#include "aci.h"
#pragma once
#define SETUP_ID 0
#define SETUP_FORMAT 2 /** nRF8001 Cx */
#define ACI_DYNAMIC_DATA_SIZE 263
/* Service: GATT - Characteristic: Service Changed - Pipe: TX_ACK */
#define PIPE_GATT_SERVICE_CHANGED_TX_ACK 1
#define PIPE_GATT_SERVICE_CHANGED_TX_ACK_MAX_SIZE 4
/* Service: Device Information - Characteristic: Hardware Revision String - Pipe: SET */
#define PIPE_DEVICE_INFORMATION_HARDWARE_REVISION_STRING_SET 2
#define PIPE_DEVICE_INFORMATION_HARDWARE_REVISION_STRING_SET_MAX_SIZE 9
/* Service: Device Information - Characteristic: Manufacturer Name String - Pipe: SET */
#define PIPE_DEVICE_INFORMATION_MANUFACTURER_NAME_STRING_SET 3
#define PIPE_DEVICE_INFORMATION_MANUFACTURER_NAME_STRING_SET_MAX_SIZE 20
/* Service: Device Information - Characteristic: Model Number String - Pipe: SET */
#define PIPE_DEVICE_INFORMATION_MODEL_NUMBER_STRING_SET 4
#define PIPE_DEVICE_INFORMATION_MODEL_NUMBER_STRING_SET_MAX_SIZE 8
/* Service: Device Information - Characteristic: Firmware Revision String - Pipe: SET */
#define PIPE_DEVICE_INFORMATION_FIRMWARE_REVISION_STRING_SET 5
#define PIPE_DEVICE_INFORMATION_FIRMWARE_REVISION_STRING_SET_MAX_SIZE 4
/* Service: Device Information - Characteristic: PNP_ID - Pipe: SET */
#define PIPE_DEVICE_INFORMATION_PNP_ID_SET 6
#define PIPE_DEVICE_INFORMATION_PNP_ID_SET_MAX_SIZE 7
/* Service: UART over BTLE - Characteristic: UART RX - Pipe: RX */
#define PIPE_UART_OVER_BTLE_UART_RX_RX 7
#define PIPE_UART_OVER_BTLE_UART_RX_RX_MAX_SIZE 20
/* Service: UART over BTLE - Characteristic: UART TX - Pipe: TX */
#define PIPE_UART_OVER_BTLE_UART_TX_TX 8
#define PIPE_UART_OVER_BTLE_UART_TX_TX_MAX_SIZE 20
/* Service: UART over BTLE - Characteristic: UART Control Point - Pipe: TX */
#define PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_TX 9
#define PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_TX_MAX_SIZE 9
/* Service: UART over BTLE - Characteristic: UART Control Point - Pipe: RX */
#define PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_RX 10
#define PIPE_UART_OVER_BTLE_UART_CONTROL_POINT_RX_MAX_SIZE 9
/* Service: UART over BTLE - Characteristic: UART Link Timing Current - Pipe: SET */
#define PIPE_UART_OVER_BTLE_UART_LINK_TIMING_CURRENT_SET 11
#define PIPE_UART_OVER_BTLE_UART_LINK_TIMING_CURRENT_SET_MAX_SIZE 6
#define NUMBER_OF_PIPES 11
#define SERVICES_PIPE_TYPE_MAPPING_CONTENT {\
{ACI_STORE_LOCAL, ACI_TX_ACK}, \
{ACI_STORE_LOCAL, ACI_SET}, \
{ACI_STORE_LOCAL, ACI_SET}, \
{ACI_STORE_LOCAL, ACI_SET}, \
{ACI_STORE_LOCAL, ACI_SET}, \
{ACI_STORE_LOCAL, ACI_SET}, \
{ACI_STORE_LOCAL, ACI_RX}, \
{ACI_STORE_LOCAL, ACI_TX}, \
{ACI_STORE_LOCAL, ACI_TX}, \
{ACI_STORE_LOCAL, ACI_RX}, \
{ACI_STORE_LOCAL, ACI_SET}, \
}
#define GAP_PPCP_MAX_CONN_INT 0x12 /**< Maximum connection interval as a multiple of 1.25 msec , 0xFFFF means no specific value requested */
#define GAP_PPCP_MIN_CONN_INT 0xa /**< Minimum connection interval as a multiple of 1.25 msec , 0xFFFF means no specific value requested */
#define GAP_PPCP_SLAVE_LATENCY 0
#define GAP_PPCP_CONN_TIMEOUT 0xa /** Connection Supervision timeout multiplier as a multiple of 10msec, 0xFFFF means no specific value requested */
#define NB_SETUP_MESSAGES 30
#define SETUP_MESSAGES_CONTENT {\
{0x00,\
{\
0x07,0x06,0x00,0x00,0x02,0x02,0x41,0xfe,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0b,0x01,0x01,0x00,0x00,0x06,0x00,0x00,\
0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
},\
},\
{0x00,\
{\
0x1e,0x06,0x10,0x1c,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x03,0x90,0x01,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x00,0x04,0x04,0x02,0x02,0x00,0x01,0x28,0x00,0x01,0x00,0x18,0x04,0x04,0x05,0x05,0x00,\
0x02,0x28,0x03,0x01,0x02,0x03,0x00,0x00,0x2a,0x04,0x04,0x14,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x1c,0x05,0x00,0x03,0x2a,0x00,0x01,0x48,0x65,0x6c,0x6c,0x6f,0x63,0x73,0x65,0x6d,0x69,\
0x2e,0x63,0x6f,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x38,0x05,0x05,0x00,0x04,0x28,0x03,0x01,0x02,0x05,0x00,0x01,0x2a,0x06,0x04,0x03,0x02,\
0x00,0x05,0x2a,0x01,0x01,0x80,0x00,0x04,0x04,0x05,0x05,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x54,0x06,0x28,0x03,0x01,0x02,0x07,0x00,0x04,0x2a,0x06,0x04,0x09,0x08,0x00,0x07,0x2a,\
0x04,0x01,0x0a,0x00,0x12,0x00,0x00,0x00,0x0a,0x00,0x04,0x04,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x70,0x02,0x02,0x00,0x08,0x28,0x00,0x01,0x01,0x18,0x04,0x04,0x05,0x05,0x00,0x09,0x28,\
0x03,0x01,0x22,0x0a,0x00,0x05,0x2a,0x26,0x04,0x05,0x04,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0x8c,0x0a,0x2a,0x05,0x01,0x00,0x00,0x00,0x00,0x46,0x14,0x03,0x02,0x00,0x0b,0x29,0x02,\
0x01,0x00,0x00,0x04,0x04,0x02,0x02,0x00,0x0c,0x28,0x00,0x01,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0xa8,0x0a,0x18,0x04,0x04,0x05,0x05,0x00,0x0d,0x28,0x03,0x01,0x02,0x0e,0x00,0x27,0x2a,\
0x04,0x04,0x09,0x01,0x00,0x0e,0x2a,0x27,0x01,0x0a,0x00,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x05,0x00,0x0f,0x28,0x03,0x01,0x02,\
0x10,0x00,0x29,0x2a,0x04,0x04,0x14,0x02,0x00,0x10,0x2a,0x29,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0xe0,0x01,0x30,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x05,0x00,0x11,0x28,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x20,0xfc,0x03,0x01,0x02,0x12,0x00,0x24,0x2a,0x04,0x04,0x08,0x02,0x00,0x12,0x2a,0x24,0x01,\
0x31,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x05,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0x18,0x00,0x13,0x28,0x03,0x01,0x02,0x14,0x00,0x26,0x2a,0x04,0x04,0x04,0x02,0x00,0x14,\
0x2a,0x26,0x01,0x33,0x34,0x00,0x00,0x04,0x04,0x05,0x05,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0x34,0x15,0x28,0x03,0x01,0x02,0x16,0x00,0x50,0x2a,0x06,0x04,0x08,0x07,0x00,0x16,0x2a,\
0x50,0x01,0x02,0x00,0x00,0xaa,0xaa,0xcc,0xcc,0x04,0x04,0x10,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0x50,0x10,0x00,0x17,0x28,0x00,0x01,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,\
0xa3,0xb5,0x01,0x00,0x40,0x6e,0x04,0x04,0x13,0x13,0x00,0x18,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0x6c,0x28,0x03,0x01,0x04,0x19,0x00,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,\
0xa3,0xb5,0x02,0x00,0x40,0x6e,0x44,0x10,0x14,0x00,0x00,0x19,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0x88,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x13,0x13,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0xa4,0x1a,0x28,0x03,0x01,0x10,0x1b,0x00,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,\
0xf3,0xa3,0xb5,0x03,0x00,0x40,0x6e,0x14,0x00,0x14,0x00,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0xc0,0x1b,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x14,0x03,0x02,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0xdc,0x00,0x1c,0x29,0x02,0x01,0x00,0x00,0x04,0x04,0x13,0x13,0x00,0x1d,0x28,0x03,0x01,\
0x14,0x1e,0x00,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x21,0xf8,0xf3,0xa3,0xb5,0x04,0x00,0x40,0x6e,0x54,0x10,0x09,0x00,0x00,0x1e,0x00,0x04,0x02,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x14,0x03,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x22,0x14,0x02,0x00,0x1f,0x29,0x02,0x01,0x00,0x00,0x04,0x04,0x13,0x13,0x00,0x20,0x28,0x03,\
0x01,0x02,0x21,0x00,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,\
},\
},\
{0x00,\
{\
0x1b,0x06,0x22,0x30,0x93,0xf3,0xa3,0xb5,0x05,0x00,0x40,0x6e,0x06,0x04,0x07,0x06,0x00,0x21,0x00,0x05,\
0x02,0xff,0xff,0xff,0xff,0xff,0xff,0x00,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x40,0x00,0x2a,0x05,0x01,0x00,0x04,0x04,0x00,0x0a,0x00,0x0b,0x2a,0x27,0x01,0x00,0x80,0x04,\
0x00,0x0e,0x00,0x00,0x2a,0x29,0x01,0x00,0x80,0x04,0x00,0x10,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x40,0x1c,0x00,0x00,0x2a,0x24,0x01,0x00,0x80,0x04,0x00,0x12,0x00,0x00,0x2a,0x26,0x01,0x00,\
0x80,0x04,0x00,0x14,0x00,0x00,0x2a,0x50,0x01,0x00,0x80,0x04,\
},\
},\
{0x00,\
{\
0x1f,0x06,0x40,0x38,0x00,0x16,0x00,0x00,0x00,0x02,0x02,0x00,0x08,0x04,0x00,0x19,0x00,0x00,0x00,0x03,\
0x02,0x00,0x02,0x04,0x00,0x1b,0x00,0x1c,0x00,0x04,0x02,0x00,\
},\
},\
{0x00,\
{\
0x13,0x06,0x40,0x54,0x0a,0x04,0x00,0x1e,0x00,0x1f,0x00,0x05,0x02,0x00,0x80,0x04,0x00,0x21,0x00,0x00,\
},\
},\
{0x00,\
{\
0x13,0x06,0x50,0x00,0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,0xa3,0xb5,0x00,0x00,0x40,0x6e,\
},\
},\
{0x00,\
{\
0x06,0x06,0xf0,0x00,0x02,0xb2,0xd1,\
},\
},\
}

View File

@ -27,90 +27,72 @@
#define DEVICE_ADDRESS 0x3C
#define BUS_NUMBER 0x0
static uint8_t SeeedLogo[] ={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x60, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x80, 0xf0, 0x20, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x60, 0xe0, 0xc0,
0xc0, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x60, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x80, 0xc0,
0xc0, 0xe0, 0x60, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x60, 0xe0, 0xc0, 0xc0,
0x80, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0xc0, 0xc0, 0xe0, 0x60, 0xc0, 0xc0, 0x80, 0x00, 0xc0, 0xf0, 0xf0, 0xf0, 0xc0, 0x00, 0xc0,
0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xc0, 0xc0,
0xf8, 0xf8, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0x60, 0xc0, 0xc0, 0x80, 0x00,
0x00, 0x03, 0x0f, 0x1e, 0x3c, 0x70, 0xe3, 0xcf, 0x9f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x70, 0xbf,
0xcf, 0xe3, 0x70, 0x78, 0x3e, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x33, 0x77, 0x66, 0x66, 0x66, 0x6c,
0x7d, 0x18, 0x00, 0x1f, 0x3f, 0x76, 0x66, 0x66, 0x66, 0x76, 0x37, 0x07, 0x00, 0x0f, 0x3f, 0x7f,
0x66, 0x66, 0x66, 0x66, 0x77, 0x27, 0x07, 0x00, 0x1f, 0x3f, 0x76, 0x66, 0x66, 0x66, 0x76, 0x37,
0x07, 0x00, 0x0f, 0x3f, 0x71, 0x60, 0x60, 0x60, 0x60, 0x31, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
0x11, 0x37, 0x67, 0x66, 0x66, 0x6c, 0x7d, 0x38, 0x00, 0x00, 0x3f, 0x7f, 0x3f, 0x00, 0x00, 0x1f,
0x3f, 0x70, 0x60, 0x60, 0x70, 0x7f, 0x7f, 0x00, 0x0f, 0x3f, 0x71, 0x60, 0x60, 0x60, 0x60, 0x31,
0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x06, 0x1f, 0x3b, 0x60, 0x60, 0x60, 0x60, 0x71, 0x3f, 0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x48, 0x48, 0x48, 0xb0, 0x00, 0xc0, 0x20,
0x20, 0x20, 0xc0, 0x00, 0xc0, 0x20, 0x20, 0x20, 0xc0, 0x00, 0x40, 0xa0, 0xa0, 0xa0, 0x20, 0x00,
0x00, 0x20, 0xf0, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0xf8, 0x08,
0x08, 0x00, 0xc0, 0x20, 0x20, 0x20, 0xf8, 0x00, 0xc0, 0xa0, 0xa0, 0xa0, 0xc0, 0x00, 0x20, 0xa0,
0xa0, 0xa0, 0xc0, 0x00, 0x40, 0xa0, 0xa0, 0xa0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x48, 0x48, 0x48, 0x08, 0x00, 0x20, 0x40, 0x80, 0x40,
0x20, 0x00, 0x00, 0x20, 0xf0, 0x20, 0x20, 0x00, 0xc0, 0xa0, 0xa0, 0xa0, 0xc0, 0x00, 0xe0, 0x00,
0x20, 0x20, 0xc0, 0x00, 0xc0, 0x20, 0x20, 0x20, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x02,
0x02, 0x02, 0x01, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00,
0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x02,
0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02,
0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x82, 0x02, 0x00, 0x02, 0x01, 0x01, 0x01,
0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x03, 0x00,
0x00, 0x00, 0x03, 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x82, 0x8c, 0x60, 0x1c, 0x02, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x1c, 0x00, 0x1e,
0x20, 0x20, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3e, 0x04, 0x02, 0x02, 0x00, 0x1c, 0x2a, 0x2a, 0x2a, 0x0c, 0x00, 0x12, 0x2a, 0x2a,
0x2a, 0x1c, 0x20, 0x1c, 0x22, 0x22, 0x22, 0x14, 0x00, 0x3f, 0x00, 0x02, 0x02, 0x3c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static uint8_t intel_logo[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 192, 192, 192, 224,
224, 224, 224, 240, 240, 248, 248, 120, 120, 120, 120, 60, 60, 60, 60, 60,
62, 30, 30, 30, 30, 30, 30, 30, 31, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 31,
30, 62, 62, 62, 62, 126, 126, 124, 124, 252, 252, 248, 248, 240, 240, 240,
224, 224, 224, 192, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128,
128, 0, 56, 56, 28, 30, 14, 15, 15, 7, 7, 7, 7, 3, 3, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 192, 193, 195, 195,
195, 7, 15, 15, 63, 127, 255, 255, 255, 254, 252, 252, 240, 192, 0, 0, 0,
0, 0, 0, 0, 0, 128, 192, 192, 240, 248, 124, 124, 60, 0, 0, 0, 0, 159, 159,
159, 159, 159, 159, 159, 159, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0,
0, 0, 0, 0, 254, 254, 254, 254, 254, 254, 254, 254, 128, 128, 128, 128,
128, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 192, 192, 192, 192, 192, 192, 128,
128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255,
0, 0, 0, 0, 3, 7, 3, 3, 3, 0, 0, 0, 0, 0, 1, 1, 255, 255, 255, 255, 255,
255, 255, 0, 0, 224, 248, 252, 252, 255, 127, 15, 15, 3, 1, 0, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255,
255, 255, 255, 255, 255, 15, 15, 15, 15, 15, 15, 255, 255, 255, 255, 255,
255, 255, 252, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 15, 15,
15, 15, 15, 224, 224, 252, 254, 255, 255, 255, 255, 159, 159, 143, 143,
135, 135, 143, 159, 255, 255, 255, 255, 255, 255, 252, 248, 0, 0, 0, 255,
255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,
224, 248, 248, 255, 255, 255, 255, 255, 127, 15, 255, 255, 255, 255, 255,
255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255,
255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255,
255, 255, 255, 255, 255, 192, 192, 192, 192, 192, 31, 31, 255, 255, 255,
255, 255, 255, 231, 231, 199, 199, 199, 199, 199, 199, 199, 199, 231, 231,
231, 231, 199, 135, 0, 0, 0, 63, 255, 255, 255, 255, 255, 255, 255, 0, 0,
0, 0, 224, 240, 248, 248, 252, 254, 255, 255, 255, 127, 63, 63, 31, 15, 7,
7, 1, 0, 0, 63, 63, 255, 255, 255, 255, 255, 240, 192, 192, 128, 0, 0, 0,
0, 0, 0, 0, 0, 1, 3, 3, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 3, 3, 7, 7, 7,
7, 7, 7, 7, 7, 7, 0, 0, 0, 1, 3, 3, 3, 7, 7, 7, 7, 15, 15, 15, 15, 7, 7, 7,
7, 7, 3, 3, 3, 1, 0, 0, 0, 0, 1, 3, 3, 7, 135, 135, 135, 192, 192, 0, 0, 7,
7, 3, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 15,
31, 127, 127, 127, 255, 255, 252, 252, 252, 248, 240, 240, 240, 224, 224,
224, 192, 192, 192, 192, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 192, 192, 192, 192, 192,
224, 224, 224, 224, 240, 240, 240, 240, 248, 248, 248, 248, 252, 252, 252,
254, 254, 255, 255, 255, 255, 255, 255, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
3, 3, 3, 7, 7, 7, 15, 15, 31, 31, 31, 63, 63, 63, 63, 63, 127, 127, 127,
127, 127, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254,
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
255, 255, 255, 255, 255, 255, 255, 127, 127, 127, 127, 127, 127, 127, 127,
63, 63, 63, 63, 63, 31, 31, 31, 31, 31, 15, 15, 15, 15, 7, 7, 7, 7, 3, 3,
3, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 };
int
main(int argc, char **argv)
{
upm::SSD1308 *lcd = new upm::SSD1308 (BUS_NUMBER, DEVICE_ADDRESS);
//! [Interesting]
upm::SSD1308 *lcd = new upm::SSD1308(BUS_NUMBER, DEVICE_ADDRESS);
/*
* Simple print hello world
*/
// lcd->setCursor (0, 0);
// lcd->write ("Hello World");
lcd->clear();
lcd->draw(intel_logo, 1024);
/*
* Simple print hello world
*/
lcd->clear ();
lcd->draw (SeeedLogo, 1024);
lcd->close ();
lcd->close();
//! [Interesting]
}

View File

@ -106,21 +106,19 @@ static uint8_t SeeedLogo[] ={
int
main(int argc, char **argv)
{
upm::SSD1327 *lcd = new upm::SSD1327 (BUS_NUMBER, 0x3C);
//! [Interesting]
upm::SSD1327 *lcd = new upm::SSD1327(BUS_NUMBER, 0x3C);
/*
* Simple print hello world
*/
for(uint8_t i = 0; i < 12 ; i++) {
lcd->setCursor (i, 0);
lcd->setGrayLevel (i);
lcd->write ("Hello World");
// Simple print hello world
for (uint8_t i = 0; i < 12; i++) {
lcd->setCursor(i, 0);
lcd->setGrayLevel(i);
lcd->write("Hello World");
}
/*
* Simple print hello world
*/
lcd->draw (SeeedLogo, 96 * 96 / 8);
// Simple print hello world
lcd->draw(SeeedLogo, 96 * 96 / 8);
lcd->close ();
lcd->close();
//! [Interesting]
}

View File

@ -0,0 +1,74 @@
#!/usr/bin/env python
# Author: Brendan Le Foll <brendan.le.foll@intel.com>
# Copyright (c) 2014 Intel Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
from __future__ import print_function
from PIL import Image
import sys
# Pixels are arranged in one byte for 8 vertical pixels and not addressed individually
# We convert the image to greysacle and end up making it monochrome where we
# consider that every pixel that is '40' is black.
width = 128
height = 64
if len(sys.argv) != 2:
print('Please specify an image to use as the only argument')
exit(1)
im = Image.open(sys.argv[1])
im = im.convert('L').resize((width, height))
data = list(im.getdata())
byteblock = [0 for i in range(width)]
widthblock = [list(byteblock) for i in range(int(height/8))]
numblock = 0
pixcount = 0
i = 0
# we split the list by width * 8, to create data chunks of 8rows
datachunks=[data[x:x+(width*8)] for x in range(0, len(data), (width*8))]
# grab every pixel of image (or datachunk)
while i < len(widthblock):
pixcount = 0
for y in datachunks[i]:
xcoor = pixcount % width
ycoor = int(pixcount/width)
blknum = xcoor % len(widthblock)
blkycoor = ycoor
# 40 is what we consider 'black'
if y > 40:
widthblock[i][xcoor] |= (1 << blkycoor)
pixcount += 1
i += 1
flatlist = [y for x in widthblock for y in x]
carray = 'static uint8_t image[] = {\n' + ', '.join(str(x) for x in flatlist)
print(carray + '\n};')

View File

@ -0,0 +1,31 @@
#!/usr/bin/env python
# Author: Brendan Le Foll <brendan.le.foll@intel.com>
# Copyright (c) 2014 Intel Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
import pyupm_mic
mymic = pyupm_mic.Microphone(1)
# careful this is an unitialised array with no bounds checking!
x = pyupm_mic.uint16Array(3)
mymic.getSampledWindow(100, 3, x)

View File

@ -27,6 +27,7 @@
int
main(int argc, char **argv)
{
//! [Interesting]
// 0x62 RGB_ADDRESS, 0x3E LCD_ADDRESS
upm::Jhd1313m1 *lcd = new upm::Jhd1313m1(0, 0x3E, 0x62);
lcd->setCursor(0,0);
@ -34,4 +35,5 @@ main(int argc, char **argv)
lcd->setCursor(1,2);
lcd->write("Hello World");
lcd->close();
//! [Interesting]
}

View File

@ -0,0 +1,62 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "tcs3414cs.h"
#include <signal.h>
int doWork = 0;
upm::TCS3414CS *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
upm::tcs3414sc_rgb_t rgb;
sensor = new upm::TCS3414CS ();
while (!doWork) {
sensor->readRGB (&rgb);
std::cout << (int)rgb.r << ", " << (int)rgb.g << ", " << (int)rgb.b << ", " << rgb.clr << std::endl;
usleep (500000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

64
examples/th02-example.cxx Normal file
View File

@ -0,0 +1,64 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <unistd.h>
#include <iostream>
#include "th02.h"
#include <signal.h>
int doWork = 0;
upm::TH02 *sensor = NULL;
void
sig_handler(int signo)
{
printf("got signal\n");
if (signo == SIGINT) {
printf("exiting application\n");
doWork = 1;
}
}
int
main(int argc, char **argv)
{
//! [Interesting]
float temperature = 0.0;
float humidity = 0.0;
sensor = new upm::TH02 ();
while (!doWork) {
temperature = sensor->getTemperature ();
// humidity = sensor->getHumidity ();
std::cout << "Temperature = " << temperature << ", Humidity = " << humidity << std::endl;
usleep (500000);
}
//! [Interesting]
std::cout << "exiting application" << std::endl;
delete sensor;
return 0;
}

View File

@ -16,8 +16,7 @@ macro (upm_CREATE_INSTALL_PKGCONFIG generated_file install_location)
endmacro (upm_CREATE_INSTALL_PKGCONFIG)
macro(upm_SWIG_PYTHON)
if(BUILDSWIGPYTHON)
set (CMAKE_C_FLAGS -DSWIGPYTHON=${SWIG_FOUND})
if (BUILDSWIGPYTHON AND BUILDSWIG)
set_source_files_properties (pyupm_${libname}.i PROPERTIES CPLUSPLUS ON)
swig_add_module (pyupm_${libname} python pyupm_${libname}.i ${module_src})
swig_link_libraries (pyupm_${libname} ${PYTHON_LIBRARIES} ${MRAA_LIBRARIES})
@ -34,8 +33,7 @@ macro(upm_SWIG_PYTHON)
endmacro()
macro(upm_SWIG_NODE)
if(BUILDSWIGNODE)
set (CMAKE_CXX_FLAGS -DBUILDING_NODE_EXTENSION)
if (BUILDSWIGNODE AND BUILDSWIG)
set_source_files_properties (jsupm_${libname}.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties (jsupm_${libname}.i PROPERTIES SWIG_FLAGS "-node")
swig_add_module (jsupm_${libname} javascript jsupm_${libname}.i ${module_src})
@ -45,6 +43,7 @@ macro(upm_SWIG_NODE)
"${NODE_INCLUDE_DIRS}"
)
set_target_properties (jsupm_${libname} PROPERTIES
COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -DBUILDING_NODE_EXTENSION"
PREFIX ""
SUFFIX ".node"
)
@ -65,7 +64,11 @@ macro(upm_doxygen)
)
add_custom_target (${libname}doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${libname}_doc.i)
add_dependencies (${libname}doc_i doc)
add_dependencies (${SWIG_MODULE_pyupm_${libname}_REAL_NAME} ${libname}doc_i)
if (BUILDSWIG)
add_dependencies (_pyupm_${libname} ${libname}doc_i)
else ()
add_dependencies (${libname} doc)
endif ()
endif ()
endmacro()
@ -107,6 +110,8 @@ macro(upm_module_init)
if (SWIG_FOUND)
upm_swig_python()
upm_swig_node()
endif()
if (BUILDDOC)
upm_doxygen()
endif()
install (TARGETS ${libname} DESTINATION lib COMPONENT ${libname})

View File

@ -49,7 +49,7 @@ class Buzzer {
/**
* Instanciates a Buzzer object
*
* @param pin Buzzer pin number
* @param pinNumber Buzzer pin number
*/
Buzzer (int pinNumber);

View File

@ -1,4 +1,5 @@
%module jsupm_buzzer
%include "../upm.i"
%{
#include "buzzer.h"

View File

@ -1,4 +1,5 @@
%module pyupm_buzzer
%include "../upm.i"
%feature("autodoc", "3");

3
src/carrays_uint16_t.i Normal file
View File

@ -0,0 +1,3 @@
%include "stdint.i"
%include "carrays.i"
%array_class(uint16_t, uint16Array);

View File

@ -0,0 +1,5 @@
set (libname "ecs1030")
set (libdescription "Non-invasive current sensor")
set (module_src ${libname}.cxx)
set (module_h ${libname}.h)
upm_module_init()

101
src/ecs1030/ecs1030.cxx Normal file
View File

@ -0,0 +1,101 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include "ecs1030.h"
using namespace upm;
struct ECS1030Exception : public std::exception {
std::string message;
ECS1030Exception (std::string msg) : message (msg) { }
~ECS1030Exception () throw () { }
const char* what() const throw () { return message.c_str(); }
};
ECS1030::ECS1030 (uint8_t pinNumber) {
m_dataPinCtx = mraa_aio_init(pinNumber);
if (m_dataPinCtx == NULL) {
throw ECS1030Exception ("GPIO failed to initilize");
}
m_calibration = 111.1;
}
ECS1030::~ECS1030 () {
mraa_result_t error = MRAA_SUCCESS;
error = mraa_aio_close (m_dataPinCtx);
if (error != MRAA_SUCCESS) {
}
}
double
ECS1030::getCurrency_A () {
int sensorValue = 0;
float rLoad = 0;
float volt = 0;
float rms = 0;
for (int i = 0; i < NUMBER_OF_SAMPLES; i++) {
sensorValue = mraa_aio_read (m_dataPinCtx);
volt = (VOLT_M * sensorValue) - 2.5;
volt = volt * volt;
rms = rms + volt;
usleep (DELAY_MS);
}
rms = rms / (float)NUMBER_OF_SAMPLES;
rms = sqrt(rms);
return rms / R_LOAD;
}
double
ECS1030::getCurrency_B () {
double sumCurrency = 0;
for (int i = 0; i < NUMBER_OF_SAMPLES; i++) {
m_lastSample = m_sample;
m_sample = mraa_aio_read (m_dataPinCtx);
m_lastFilter = m_filteredSample;
m_filteredSample = 0.996 * (m_lastFilter + m_sample - m_lastSample);
sumCurrency += (m_filteredSample * m_filteredSample);
}
double ratio = m_calibration * ((SUPPLYVOLTAGE / 1000.0) / (ADC_RESOLUTION));
return ( ratio * sqrt(sumCurrency / NUMBER_OF_SAMPLES) );
}
double
ECS1030::getPower_A () {
return 220.0 * getCurrency_A ();
}
double
ECS1030::getPower_B () {
return 220.0 * getCurrency_B ();
}

97
src/ecs1030/ecs1030.h Normal file
View File

@ -0,0 +1,97 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include <math.h>
#include <mraa/aio.h>
#include <mraa/gpio.h>
#define NUMBER_OF_SAMPLES 500
#define ADC_RESOLUTION 1024
#define SUPPLYVOLTAGE 5100
#define CURRENT_RATIO 2000.0
#define HIGH 1
#define LOW 0
#define TRUE HIGH
#define FALSE LOW
namespace upm {
class ECS1030 {
public:
static const uint8_t DELAY_MS = 20000 / NUMBER_OF_SAMPLES; /* 1/50Hz is 20ms period */
static const uint8_t VOLT_M = 5.1 / 1023;
static const uint8_t R_LOAD = 2000.0 / CURRENT_RATIO;
/**
* Instanciates a ECS1030 (current sensor) object
*
* @param pinNumber number of the data pin
*/
ECS1030 (uint8_t pinNumber);
/**
* ECS1030 object destructor, basicaly it close the GPIO.
*/
~ECS1030 ();
/**
* Return currency data for the sampled period
*/
double getCurrency_A ();
/**
* Return power data for the sampled period
*/
double getPower_A ();
/**
* Return currency data for the sampled period
*/
double getCurrency_B ();
/**
* Return power data for the sampled period
*/
double getPower_B ();
/**
* Return name of the component
*/
std::string name() {
return m_name;
}
private:
std::string m_name;
mraa_aio_context m_dataPinCtx;
double m_calibration;
int m_lastSample;
double m_lastFilter;
int m_sample;
double m_filteredSample;
};
}

View File

@ -0,0 +1,8 @@
%module jsupm_ecs1030
%include "../upm.i"
%{
#include "ecs1030.h"
%}
%include "ecs1030.h"

View File

@ -0,0 +1,11 @@
%module pyupm_ecs1030
%include "../upm.i"
%include "stdint.i"
%feature("autodoc", "3");
%include "ecs1030.h"
%{
#include "ecs1030.h"
%}

5
src/gas/CMakeLists.txt Normal file
View File

@ -0,0 +1,5 @@
set (libname "gas")
set (libdescription "Gas sensors")
set (module_src ${libname}.cxx mq2.cxx mq3.cxx mq5.cxx mq9.cxx)
set (module_h ${libname}.h mq2.h mq3.h mq5.h mq9.h)
upm_module_init()

6
src/gas/README.txt Normal file
View File

@ -0,0 +1,6 @@
Grove - Gas Sensor(MQ-2)Combustible Gas Smoke [middle sensitivity]
Grove - Gas Sensor(MQ-3)Alcohol and Benzine [HIGH sensitivity] Long warmup
Grove - Gas Sensor(MQ-5)LPG, Natural Gas, Town Gas [high sensitivity]
Grove - Gas Sensor(MQ-9)LPG, CO, CH4 [low sensitivity]
Note - Gas sensor need to be heated, first minute the data is incorrect.

105
src/gas/gas.cxx Normal file
View File

@ -0,0 +1,105 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <functional>
#include <string.h>
#include "gas.h"
using namespace upm;
Gas::Gas(int gasPin) {
// initialise analog gas input
m_gasCtx = mraa_aio_init(gasPin);
}
Gas::~Gas() {
// close analog input
mraa_result_t error;
error = mraa_aio_close(m_gasCtx);
if (error != MRAA_SUCCESS) {
mraa_result_print(error);
}
}
int
Gas::getSampledWindow (unsigned int freqMS, unsigned int numberOfSamples,
uint16_t * buffer) {
int sampleIdx = 0;
// must have freq
if (!freqMS) {
return 0;
}
// too much samples
if (numberOfSamples > 0xFFFFFF) {
return 0;
}
while (sampleIdx < numberOfSamples) {
buffer[sampleIdx++] = mraa_aio_read (m_gasCtx);
usleep(freqMS * 1000);
}
return sampleIdx;
}
int
Gas::findThreshold (thresholdContext* ctx, unsigned int threshold,
uint16_t * buffer, unsigned int len) {
long sum = 0;
for (unsigned int i = 0; i < len; i++) {
sum += buffer[i];
}
ctx->averageReading = sum / len;
ctx->runningAverage = (((ctx->averagedOver-1) * ctx->runningAverage) + ctx->averageReading) / ctx->averagedOver;
if (ctx->runningAverage > threshold) {
return ctx->runningAverage;
} else {
return 0;
}
}
int
Gas::getSampledData (thresholdContext* ctx) {
return ctx->runningAverage;
}
int
Gas::getSample (thresholdContext* ctx) {
return mraa_aio_read (m_gasCtx);
}
void
Gas::printGraph (thresholdContext* ctx, uint8_t resolution) {
std::cout << "(" << ctx->runningAverage << ") | ";
for (int i = 0; i < ctx->runningAverage / resolution; i++)
std::cout << "*";
std::cout << std::endl;
}

104
src/gas/gas.h Normal file
View File

@ -0,0 +1,104 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include <mraa/gpio.h>
#include <mraa/aio.h>
struct thresholdContext {
long averageReading;
long runningAverage;
int averagedOver;
};
namespace upm {
/**
* @brief C++ API for Gas sensors
*
* This file defines the Gas Analog sensors virtual functions
*/
class Gas {
public:
/**
* Instanciates a Gas object
*
* @param gasPin pin where gas is connected
*/
Gas(int gasPin);
/**
* Gas object destructor
*/
~Gas();
/**
* Get samples from gas sensor according to provided window and
* number of samples
*
* @param freqMS time between each sample (in microseconds)
* @param numberOfSamples number of sample to sample for this window
* @param buffer bufer with sampled data
*/
virtual int getSampledWindow (unsigned int freqMS, unsigned int numberOfSamples, uint16_t * buffer);
/**
* Given sampled buffer this method will return TRUE/FALSE if threshold
* was reached
*
* @param ctx threshold context
* @param threshold sample threshold
* @param buffer buffer with samples
* @param len bufer len
*/
virtual int findThreshold (thresholdContext* ctx, unsigned int threshold, uint16_t * buffer, unsigned int len);
/**
* Return avarage data for the sampled window
*
* @param ctx threshold context
*/
virtual int getSampledData (thresholdContext* ctx);
/**
* Return one sample from the sensor
*
* @param ctx threshold context
*/
virtual int getSample (thresholdContext* ctx);
/**
*
* Print running average of threshold context
*
* @param ctx threshold context
*/
virtual void printGraph (thresholdContext* ctx, uint8_t resolution);
protected:
mraa_aio_context m_gasCtx;
};
}

9
src/gas/jsupm_gas.i Normal file
View File

@ -0,0 +1,9 @@
%module jsupm_gas
%include "../upm.i"
%include "../carrays_uint16_t.i"
%{
#include "gas.h"
%}
%include "gas.h"

33
src/gas/mq2.cxx Normal file
View File

@ -0,0 +1,33 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "mq2.h"
using namespace upm;
MQ2::MQ2 (int gasPin) : Gas (gasPin) {
}
MQ2::~MQ2 () {
}

66
src/gas/mq2.h Normal file
View File

@ -0,0 +1,66 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <iostream>
#include <string>
#include "gas.h"
namespace upm {
/**
* @brief C++ API for MQ2 gas sensor
*
* The Grove - Gas Sensor (MQ2) module is useful for gas leakage detecting
* (in home and industry). It can detect LPG, i-butane, methane, alcohol,
* Hydrogen, smoke and other combustible gases. It's a medium sensitivity
* sensor with a detect concentration of 300-10000ppm.
*
* @snippet mq2-example.cxx Interesting
* @image html grovegas.jpeg
*/
class MQ2 : public Gas {
public:
/**
* MQ2 constructor
*
* @param gasPin analog pin where sensor connected
*/
MQ2 (int gasPin);
/**
* MQ2 destructor
*/
~MQ2 ();
/**
* Return name of the component
*/
std::string name()
{
return m_name;
}
private:
std::string m_name;
};
}

33
src/gas/mq3.cxx Normal file
View File

@ -0,0 +1,33 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "mq3.h"
using namespace upm;
MQ3::MQ3 (int gasPin) : Gas (gasPin) {
}
MQ3::~MQ3 () {
}

66
src/gas/mq3.h Normal file
View File

@ -0,0 +1,66 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <iostream>
#include <string>
#include "gas.h"
namespace upm {
/**
* @brief C++ API for MQ3 gas sensor
*
* The Grove MQ3 Gas Sensor module is useful for gas leakage detecting (in
* home and industry). It can detect Alcohol Vapour and Benzine. It's
* highly sensitive but has a long warmup time of about 1minute. It's
* detect rate is of 0.04-4mg/L Alcohol.
*
* @snippet mq3-example.cxx Interesting
* @image html grovegas.jpeg
*/
class MQ3 : public Gas {
public:
/**
* MQ3 constructor
*
* @param gasPin analog pin where sensor connected
*/
MQ3 (int gasPin);
/**
* MQ3 destructor
*/
~MQ3 ();
/**
* Return name of the component
*/
std::string name()
{
return m_name;
}
private:
std::string m_name;
};
}

33
src/gas/mq5.cxx Normal file
View File

@ -0,0 +1,33 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "mq5.h"
using namespace upm;
MQ5::MQ5 (int gasPin) : Gas (gasPin) {
}
MQ5::~MQ5 () {
}

66
src/gas/mq5.h Normal file
View File

@ -0,0 +1,66 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <iostream>
#include <string>
#include "gas.h"
namespace upm {
/**
* @brief C++ API for MQ5 gas sensor
*
* The Grove - Gas Sensor (MQ5) module is useful for gas leakage detecting
* (in home and industry). It can detect LPG, natural gas, town gas and so
* on. It is highly sensitive and has a detection concentration of
* 300-10000ppm.
*
* @snippet mq5-example.cxx Interesting
* @image html grovegas.jpeg
*/
class MQ5 : public Gas {
public:
/**
* MQ5 constructor
*
* @param gasPin analog pin where sensor connected
*/
MQ5 (int gasPin);
/**
* MQ9 destructor
*/
~MQ5 ();
/**
* Return name of the component
*/
std::string name()
{
return m_name;
}
private:
std::string m_name;
};
}

33
src/gas/mq9.cxx Normal file
View File

@ -0,0 +1,33 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "mq9.h"
using namespace upm;
MQ9::MQ9 (int gasPin) : Gas (gasPin) {
}
MQ9::~MQ9 () {
}

65
src/gas/mq9.h Normal file
View File

@ -0,0 +1,65 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <iostream>
#include <string>
#include "gas.h"
namespace upm {
/**
* @brief C++ API for MQ9 gas sensor
*
* The Grove MQ9 Gas Sensor module is useful for gas leakage detecting (in
* home and industry). It can detect Carbon Monoxide, Coal Gas and
* Liquefied Gas. It's sensitivty is 10-1000ppmCO 100-10000PPm Gas.
*
* @snippet mq9-example.cxx Interesting
* @image html mq9.jpeg
*/
class MQ9 : public Gas {
public:
/**
* Jhd1313m1 constructor
*
* @param gasPin analog pin where sensor connected
*/
MQ9 (int gasPin);
/**
* MQ9 destructor
*/
~MQ9 ();
/**
* Return name of the component
*/
std::string name()
{
return m_name;
}
private:
std::string m_name;
};
}

12
src/gas/pyupm_gas.i Normal file
View File

@ -0,0 +1,12 @@
%module pyupm_gas
%include "../upm.i"
%include "../carrays_uint16_t.i"
%include "stdint.i"
%feature("autodoc", "3");
%include "gas.h"
%{
#include "gas.h"
%}

View File

@ -40,6 +40,13 @@ class Grove {
std::string m_name;
};
/**
* @brief C++ API for Grove LED
*
* Very basic UPM module for grove LED, or any LED for that matter
*
* @snippet groveled.cxx Interesting
*/
class GroveLed: public Grove {
public:
GroveLed(int pin);
@ -51,21 +58,55 @@ class GroveLed: public Grove {
mraa_gpio_context m_gpio;
};
/**
* @brief C++ API for Grove Temperature sensor
*
* Very basic UPM module for grove temperature sensor on analog
*
* @snippet grovetemp.cxx Interesting
*/
class GroveTemp: public Grove {
public:
GroveTemp(unsigned int pin);
~GroveTemp();
/**
* Get raw value from AIO pin
*
* @return the raw value from the ADC
*/
float raw_value();
/**
* Get the temperature from the sensor
*
* @return the normalised temperature
*/
int value();
private:
mraa_aio_context m_aio;
};
/**
* @brief C++ API for Grove light sensor
*
* Very basic UPM module for grove Light sensor on analog
*
* @snippet grovelight.cxx Interesting
*/
class GroveLight: public Grove {
public:
GroveLight(unsigned int pin);
~GroveLight();
/**
* Get raw value from AIO pin
*
* @return the raw value from the ADC
*/
float raw_value();
/**
* Get the light value from the sensor
*
* @return the normalised light reading
*/
int value();
private:
mraa_aio_context m_aio;

View File

@ -1,4 +1,5 @@
%module jsupm_grove
%include "../upm.i"
%{
#include "grove.h"

View File

@ -1,4 +1,5 @@
%module pyupm_grove
%include "../upm.i"
%feature("autodoc", "3");

View File

@ -73,7 +73,8 @@ class GY65 {
* Instanciates a GY65 object
*
* @param bus number of used bus
* @param devAddr addres of used i2c device
* @param devAddr address of used i2c device
* @param mode BMP085 mode
*/
GY65 (int bus, int devAddr, uint8_t mode = BMP085_ULTRAHIGHRES);

View File

@ -1,4 +1,5 @@
%module jsupm_gy65
%include "../upm.i"
%{
#include "gy65.h"

View File

@ -1,4 +1,5 @@
%module pyupm_gy65
%include "../upm.i"
%include "stdint.i"

View File

@ -1,4 +1,5 @@
%module jsupm_hcsr04
%include "../upm.i"
%{
#include "hcsr04.h"

View File

@ -1,4 +1,5 @@
%module pyupm_hcsr04
%include "../upm.i"
%feature("autodoc", "3");

View File

@ -29,19 +29,38 @@
namespace upm {
/**
* @brief C++ API for HMC5883l (3-axis digital compass)
*
* This file defines the HMC5883l C++ interface for libhmc5883l
*
* @snippet hmc5883l.cxx Interesting
*
*/
class Hmc5883l {
public:
/// Creates a Hmc5883l object
/**
* Creates a Hmc5883l object
*
* @param bus number of used i2c bus
*
*/
Hmc5883l(int bus);
/// Returns the direction
/*
* Returns the direction
*/
float direction();
/// Returns the heading
/*
* Returns the heading
*/
float heading();
/**
* Returns a pointer to an int[3] that contains the coordinates as ints
*
* @return *int to an int[3]
*/
int* coordinates();

View File

@ -1,4 +1,5 @@
%module jsupm_hmc5883l
%include "../upm.i"
%{
#include "hmc5883l.h"

View File

@ -1,4 +1,5 @@
%module pyupm_hmc5883l
%include "../upm.i"
%feature("autodoc", "3");

View File

@ -55,6 +55,11 @@ namespace upm {
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
@ -71,7 +76,7 @@ class I2CLcd {
public:
I2CLcd (int bus, int lcdAddress);
mraa_result_t write (int x, int y, std::string msg);
virtual mraa_result_t write (std::string msg) = 0;
virtual mraa_result_t setCursor (int row, int column) = 0;
virtual mraa_result_t clear () = 0;
@ -79,7 +84,7 @@ class I2CLcd {
virtual mraa_result_t i2Cmd (mraa_i2c_context ctx, uint8_t value);
virtual mraa_result_t i2cReg (mraa_i2c_context ctx, int deviceAdress, int addr, uint8_t data);
virtual mraa_result_t i2cData (mraa_i2c_context ctx, uint8_t value);
mraa_result_t close();
std::string name()
{

View File

@ -52,7 +52,7 @@ Jhd1313m1::Jhd1313m1 (int bus, int lcdAddress, int rgbAddress) : I2CLcd(bus, lcd
i2Cmd (m_i2c_lcd_control, LCD_DISPLAYCONTROL | LCD_DISPLAYON);
clear ();
usleep(4500);
i2Cmd (m_i2c_lcd_control, LCD_ENTRYMODESET |
LCD_ENTRYLEFT |
LCD_ENTRYSHIFTDECREMENT);
@ -67,7 +67,29 @@ Jhd1313m1::Jhd1313m1 (int bus, int lcdAddress, int rgbAddress) : I2CLcd(bus, lcd
}
Jhd1313m1::~Jhd1313m1() {
}
mraa_result_t
Jhd1313m1::setColor(uint8_t r, uint8_t g, uint8_t b)
{
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 0, 0);
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 1, 0);
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 0x08, 0xAA);
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 0x04, r);
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 0x03, g);
i2cReg (m_i2c_lcd_rgb, m_rgb_address, 0x02, b);
return MRAA_SUCCESS;
}
mraa_result_t
Jhd1313m1::scroll(bool direction)
{
if (direction)
return i2Cmd (m_i2c_lcd_control, (LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT));
return i2Cmd (m_i2c_lcd_control, (LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT));
}
/*

View File

@ -28,14 +28,77 @@
namespace upm {
/**
* @brief C++ API for Jhd1313m1 i2c controller for HD44780 based displays with
* an RGB backlight such as the Grove RGB i2c LCD display
*
* The Jhd1313m1 has two i2c addreses, one belongs to a controller very similar
* to the upm::Lcm1602 LCD driver which controls the HD44780 based display and the
* other controls solely the backlight. This module was tested with the Seed
* [Grove LCD RGB Backlight v2.0 display]
* (http://www.seeedstudio.com/depot/Grove-LCD-RGB-Backlight-p-1643.html?cPath=34_36)
*
* @snippet rgb-lcd.cxx Interesting
* @image html grovergblcd.jpeg
*/
class Jhd1313m1 : public I2CLcd {
public:
Jhd1313m1 (int bus, int lcdAddress, int rgbAddress);
~Jhd1313m1 ();
mraa_result_t write (std::string msg);
mraa_result_t setCursor (int row, int column);
mraa_result_t clear ();
mraa_result_t home ();
/**
* Jhd1313m1 constructor
*
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on
* @param address the slave address the rgb backlight is on
*/
Jhd1313m1(int bus, int lcdAddress, int rgbAddress);
/**
* Jhd1313m1 destructor
*/
~Jhd1313m1();
/**
* Make the LCD scroll text
*
* @param direction, true is typical scrolling to the right
* @return Result of operation
*/
mraa_result_t scroll (bool direction);
/**
* Set the color of the backlight
*
* @param r 0-255 value for red
* @param g 0-255 value for green
* @param b 0-255 value for blue
* @return Result of operation
*/
mraa_result_t setColor(uint8_t r, uint8_t g, uint8_t b);
/**
* Write a string to LCD
*
* @param msg The std::string to write to display, note only ascii
* chars are supported
* @return Result of operation
*/
mraa_result_t write(std::string msg);
/**
* Set cursor to a coordinate
*
* @param row The row to set cursor to
* @param column The column to set cursor to
* @return Result of operation
*/
mraa_result_t setCursor(int row, int column);
/**
* Clear display from characters
*
* @return Result of operatio
*/
mraa_result_t clear();
/**
* Return to coordinate 0,0
*
* @return Result of operation
*/
mraa_result_t home();
private:
int m_rgb_address;

View File

@ -1,4 +1,5 @@
%module jsupm_i2clcd
%include "../upm.i"
%include "i2clcd.h"
%{

View File

@ -61,7 +61,7 @@ Lcm1602::Lcm1602(int bus_in, int addr_in) : I2CLcd (bus_in, addr_in) {
}
Lcm1602::~Lcm1602 () {
}
/*

View File

@ -32,22 +32,63 @@
namespace upm {
/**
* @brief C++ API for LCM1602 i2c controller for HD44780 based displays
*
* This supports all sizes of HD44780 displays from 16x2 to 4x20, the
* controller has no idea of the actual display hardware so will let you write
* further than you can see. These displays with such controllers are available
* from various manufacturers with different i2c addresses. The adafruit
* [TC1602A-01T](https://www.adafruit.com/datasheets/TC1602A-01T.pdf) seems to
* the best documented example.
*
* @snippet lcm-lcd.cxx Interesting
* @image html lcm1602.jpeg
*/
class Lcm1602 : public I2CLcd {
public:
/** LCM1602 Constructor.
* Calls MRAA initialisation functions.
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on.
*/
/**
* Lcm1602 Constructor, calls libmraa initialisation functions
*
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on
*/
Lcm1602(int bus, int address);
/**
* Lcm1602 Destructor
*/
~Lcm1602();
mraa_result_t write (std::string msg);
mraa_result_t setCursor (int row, int column);
mraa_result_t clear ();
mraa_result_t home ();
/**
* Write a string to LCD
*
* @param msg The std::string to write to display, note only ascii
* chars are supported
* @return Result of operation
*/
mraa_result_t write(std::string msg);
/**
* Set cursor to a coordinate
*
* @param row The row to set cursor to
* @param column The column to set cursor to
* @return Result of operation
*/
mraa_result_t setCursor(int row, int column);
/**
* Clear display from characters
*
* @return Result of operatio
*/
mraa_result_t clear();
/**
* Return to coordinate 0,0
*
* @return Result of operation
*/
mraa_result_t home();
private :
mraa_result_t send (uint8_t value, int mode);
mraa_result_t send(uint8_t value, int mode);
mraa_result_t write4bits(uint8_t value);
mraa_result_t expandWrite(uint8_t value);
mraa_result_t pulseEnable(uint8_t value);

View File

@ -1,4 +1,5 @@
%module pyupm_i2clcd
%include "../upm.i"
%feature("autodoc", "3");

View File

@ -29,7 +29,7 @@
namespace upm {
#define DISPLAY_CMD_OFF 0xAE
#define DISPLAY_CMD_OFF 0xAE
#define DISPLAY_CMD_ON 0xAF
#define BASE_LOW_COLUMN_ADDR 0x00
@ -145,23 +145,69 @@ typedef enum {
PAGE = 2
} displayAddressingMode;
/**
* @brief C++ API for SSD1308 i2c controlled OLED displays
*
* The [SSD1308](http://garden.seeedstudio.com/images/4/46/SSD1308_1.0.pdf) is
* a 128x64 Dot matrix OLED/PLED segment driver with controller. This
* implementation was tested using the
* [Grove LED 128×64 Display module]
* (http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_0.96%22)
* which is an OLED monochrome display
*
* @snippet oled-1308.cxx Interesting
* @image html ssd1308.jpeg
*/
class SSD1308 : public I2CLcd {
public:
/** SSD1308 Constructor.
* Calls MRAA initialisation functions.
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on.
*/
/**
* SSD1308 Constructor, calls libmraa initialisation functions
*
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on
*/
SSD1308 (int bus, int address);
/**
* SSD1308 Destructor
*/
~SSD1308 ();
/**
* Draw an image, see examples/python/make_oled_pic.py for an
* explanation on how the pixels are mapped to bytes
*
* @param data the buffer to read
* @param bytes the amount of bytes to read from the pointer
* @return Result of operation
*/
mraa_result_t draw(uint8_t *data, int bytes);
// pure virtual methods
mraa_result_t write (std::string msg);
mraa_result_t setCursor (int row, int column);
mraa_result_t clear ();
mraa_result_t home ();
/**
* Write a string to LCD
*
* @param msg The std::string to write to display, note only ascii
* chars are supported
* @return Result of operation
*/
mraa_result_t write(std::string msg);
/**
* Set cursor to a coordinate
*
* @param row The row to set cursor to
* @param column The column to set cursor to
* @return Result of operation
*/
mraa_result_t setCursor(int row, int column);
/**
* Clear display from characters
*
* @return Result of operatio
*/
mraa_result_t clear();
/**
* Return to coordinate 0,0
*
* @return Result of operation
*/
mraa_result_t home();
private:
mraa_result_t writeChar (mraa_i2c_context ctx, uint8_t value);
mraa_result_t setNormalDisplay ();

View File

@ -145,23 +145,76 @@ typedef enum {
PAGE = 2
} displayAddressingMode;
/**
* @brief C++ API for SSD1327 i2c controlled OLED displays
*
* The [SSD1327](http://garden.seeedstudio.com/images/8/82/SSD1327_datasheet.pdf)
* is a 96x96 Dot matrix OLED/PLED segment driver with controller. This
* implementation was tested using the
* [Grove LED 96×96 Display module]
* (http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_1.12%22)
* which is an OLED monochrome display
*
* @snippet oled-1327.cxx Interesting
* @image html ssd1327.jpeg
*/
class SSD1327 : public I2CLcd {
public:
/** SSD1308 Constructor.
* Calls MRAA initialisation functions.
/**
* SSD1327 Constructor, calls libmraa initialisation functions
*
* @param bus i2c bus to use
* @param address the slave address the lcd is registered on.
* @param address the slave address the lcd is registered on
*/
SSD1327 (int bus, int address);
/**
* SSD1327 destructor
*/
~SSD1327 ();
/**
* Draw an image, see examples/python/make_oled_pic.py for an
* explanation on how the pixels are mapped to bytes
*
* @param data the buffer to read
* @param bytes the amount of bytes to read from the pointer
* @return Result of operation
*/
mraa_result_t draw(uint8_t *data, int bytes);
// virtual methods
mraa_result_t write (std::string msg);
mraa_result_t setCursor (int row, int column);
mraa_result_t clear ();
mraa_result_t home ();
/**
* Set gray level for LCD panel
*
* @param gray level from 0-255
* @return Result of operation
*/
mraa_result_t setGrayLevel (uint8_t level);
/**
* Write a string to LCD
*
* @param msg The std::string to write to display, note only ascii
* chars are supported
* @return Result of operation
*/
mraa_result_t write(std::string msg);
/**
* Set cursor to a coordinate
*
* @param row The row to set cursor to
* @param column The column to set cursor to
* @return Result of operation
*/
mraa_result_t setCursor(int row, int column);
/**
* Clear display from characters
*
* @return Result of operatio
*/
mraa_result_t clear();
/**
* Return to coordinate 0,0
*
* @return Result of operation
*/
mraa_result_t home();
private:
mraa_result_t writeChar (mraa_i2c_context ctx, uint8_t value);

BIN
src/lpd8806/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/lpd8806/._.DS_Store Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
set (libname "lpd8806")
set (libdescription “Digital RGB LED strip”)
set (module_src ${libname}.cxx)
set (module_h ${libname}.h)
upm_module_init()

View File

@ -0,0 +1,8 @@
%module jsupm_lpd8806
%include "../upm.i"
%{
#include "lpd8806.h"
%}
%include "lpd8806.h"

146
src/lpd8806/lpd8806.cxx Normal file
View File

@ -0,0 +1,146 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <cstring>
#include "lpd8806.h"
using namespace upm;
struct LPD8806Exception : public std::exception {
std::string message;
LPD8806Exception (std::string msg) : message (msg) { }
~LPD8806Exception () throw () { }
const char* what() const throw () { return message.c_str(); }
};
LPD8806::LPD8806 (uint16_t pixelCount, uint8_t csn) {
mraa_result_t error = MRAA_SUCCESS;
m_name = "LPD8806";
m_pixels = NULL;
m_csnPinCtx = mraa_gpio_init (csn);
if (m_csnPinCtx == NULL) {
throw LPD8806Exception ("GPIO failed to initilize");
}
error = mraa_gpio_dir (m_csnPinCtx, MRAA_GPIO_OUT);
if (error != MRAA_SUCCESS) {
throw LPD8806Exception ("GPIO failed to initilize");
}
CSOff ();
m_spi = mraa_spi_init (0);
if (m_spi == NULL) {
throw LPD8806Exception ("SPI failed to initilize");
}
// set spi mode to mode2 (CPOL = 0, CPHA = 0)
mraa_spi_mode (m_spi, MRAA_SPI_MODE0);
CSOn ();
// issue initial latch/reset to strip:
for (uint16_t i = ((pixelCount + 31) / 32); i > 0; i--) {
mraa_spi_write (m_spi, 0);
}
CSOff ();
m_pixelsCount = pixelCount;
uint8_t latchBytes;
uint16_t dataBytes, totalBytes;
uint16_t numBytes = 0;
dataBytes = m_pixelsCount * 3;
latchBytes = (m_pixelsCount + 31) / 32;
totalBytes = dataBytes + latchBytes;
if ((m_pixels = (uint8_t *) malloc(totalBytes))) {
numBytes = totalBytes;
memset ( m_pixels , 0x80, dataBytes); // Init to RGB 'off' state
memset (&m_pixels[dataBytes], 0 , latchBytes); // Clear latch bytes
}
}
LPD8806::~LPD8806() {
mraa_result_t error = MRAA_SUCCESS;
if (m_pixels) {
free(m_pixels);
}
error = mraa_spi_stop(m_spi);
if (error != MRAA_SUCCESS) {
mraa_result_print(error);
}
error = mraa_gpio_close (m_csnPinCtx);
if (error != MRAA_SUCCESS) {
mraa_result_print(error);
}
}
void
LPD8806::setPixelColor (uint16_t pixelOffset, uint8_t r, uint8_t g, uint8_t b) {
if (pixelOffset < m_pixelsCount) { // Arrays are 0-indexed, thus NOT '<='
uint8_t *ptr = &m_pixels[pixelOffset * 3];
*ptr++ = g | 0x80; // Strip color order is GRB,
*ptr++ = r | 0x80; // not the more common RGB,
*ptr++ = b | 0x80; // so the order here is intentional; don't "fix"
}
}
void
LPD8806::show (void) {
uint8_t *ptr = m_pixels;
uint16_t byte = (m_pixelsCount * 3) + ((m_pixelsCount + 31) / 32);
while (byte--) {
mraa_spi_write (m_spi, *ptr++);
}
}
uint16_t
LPD8806::getStripLength (void) {
return m_pixelsCount;
}
/*
* **************
* private area
* **************
*/
mraa_result_t
LPD8806::CSOn () {
return mraa_gpio_write (m_csnPinCtx, HIGH);
}
mraa_result_t
LPD8806::CSOff () {
return mraa_gpio_write (m_csnPinCtx, LOW);
}

107
src/lpd8806/lpd8806.h Normal file
View File

@ -0,0 +1,107 @@
/*
* Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
* Copyright (c) 2014 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include <mraa/aio.h>
#include <mraa/gpio.h>
#include <mraa/spi.h>
#define HIGH 1
#define LOW 0
namespace upm {
/**
* @brief C++ API for LPD8806
*
* The FastPixel lpd8806 is an RGB led strip controller.
*
* @snippet lpd8806-example.cxx Interesting
* @image html lpd8806.jpeg
*/
class LPD8806 {
public:
/**
* Instanciates a LPD8806 object
*
* @param pixelCount number of pixels in the strip
* @param csn chip slect pin
*/
LPD8806 (uint16_t pixelCount, uint8_t csn);
/**
* LPD8806 object destructor, basicaly it close SPI and the GPIO.
*/
~LPD8806 ();
/**
* @param pixelOffset pixel offset in the strip of pixel
* @param r red led
* @param g green led
* @param b blue led
*/
void setPixelColor (uint16_t pixelOffset, uint8_t r, uint8_t g, uint8_t b);
/**
* Write the data stored in array of pixels to the chip
*/
void show (void);
/**
* Return length of the led strip
*/
uint16_t getStripLength (void);
/**
* Return name of the component
*/
std::string name()
{
return m_name;
}
private:
std::string m_name;
mraa_spi_context m_spi;
mraa_gpio_context m_csnPinCtx;
uint8_t* m_pixels;
uint8_t m_pixelsCount;
uint8_t readRegister (uint8_t reg);
void writeRegister (uint8_t reg, uint8_t data);
/**
* Set chip select pin LOW
*/
mraa_result_t CSOn ();
/**
* Set chip select pin HIGH
*/
mraa_result_t CSOff ();
};
}

View File

@ -0,0 +1,9 @@
%module pyupm_lpd8806
%include "../upm.i"
%feature("autodoc", "3");
%include "lpd8806.h"
%{
#include "lpd8806.h"
%}

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